【问题标题】:OData routes return 404 Not FoundOData 路由返回 404 Not Found
【发布时间】:2015-01-07 23:23:41
【问题描述】:

我已经开始在我的 WebAPi2 项目中包含 OData(目前托管在我的开发机器上的 IIS8 Express 中)。我的 OData 配置类如下所示:

public class ODataConfig
{
    private readonly ODataConventionModelBuilder modelBuilder;

    public ODataConfig()
    {
        modelBuilder = new ODataConventionModelBuilder();

        modelBuilder.EntitySet<Category>("Category");
    }

    public IEdmModel GetEdmModel()
    {
        return modelBuilder.GetEdmModel();
    }
}

然后我在我的 WebApiConfig 类中添加了以下内容:

ODataConfig odataConfig = new ODataConfig();

config.MapODataServiceRoute(
    routeName: "ODataRoute",
    routePrefix: "MyServer/OData",
    model: odataConfig.GetEdmModel(),
    defaultHandler: sessionHandler
);

从一个基本的控制器和一个动作开始,像这样:

public class CategoryController : ODataController
{
    [HttpGet]
    public IHttpActionResult Get([FromODataUri] int key)
    {
        var entity = categoryService.Get(key);
        if (entity == null)
            return NotFound();

        return Ok(entity);
    }
}

然后,在我的 HttpClient 中,请求 url 如下所示: MyServer/OData/Category(10)

但是,我收到以下错误:

{"Message":"No HTTP resource was found that matches the request URI 'http://localhost/MyServer/OData/Category(10)'.","MessageDetail":"No type was found that matches the controller named 'OData'."}

我在这里错过了什么?

编辑

如果我将 routePrefix 设置为 null 或 'odata' 并相应地更改我的请求 URL,则请求可以正常工作。所以这意味着我不能有像“myServer/odata”这样的路由前缀。

这是 OData 标准命名约定吗?如果是,是否可以覆盖?

【问题讨论】:

    标签: c# asp.net-web-api odata


    【解决方案1】:

    我一直在使用相同的 WebApiConfig.Register() 方法,该方法默认包含在 Web API 项目中,并使用以下方法进行传递:

    var builder = new ODataConventionModelBuilder();
    
    // OData entity sets..
    builder.EntitySet<Seat>("Seats");
    builder.EntitySet<Table>("Tables");
    
    // Configure the Route
    config.Routes.MapODataServiceRoute("odata", "odata", builder.GetEdmModel());
    

    第一个参数是一个友好的名字,第二个是你想要的!您可以将其更改为您想要的任何内容。

    更新:如果您使用的是 OData V4,路由的初始化如下:

    config.MapODataServiceRoute("odata", "odata", builder.GetEdmModel());

    如果您使用的是 V4,现在可以通过使用属性进行基于方法的路由(想想 Nancy 风格)

    您可以在 OWIN 启动类或 Global.asax 中使用它。无论哪种方式对我来说都很好。

    参考:http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/odata-v3/creating-an-odata-endpoint

    【讨论】:

      【解决方案2】:

      这可能为时已晚,但对于其他任何人来说...

      我认为问题不在于 odata。也许您正在运行默认路由,因为消息“未找到与名为 'OData' 的控制器匹配的类型”表明 http://localhost/MyServer/OData/Category(10) 正在使用

      进行路由
      routes.MapRoute(
          "Default", // Route name
          "{controller}/{action}/{id}", // URL with parameters
      

      所以它正在寻找一个名为 ODataController 的控制器,其操作为“Category”。您需要将“localhost/MyServer”定义为应用路由的根。不幸的是,我无法建议您如何做到这一点,但希望这会为您指明正确的方向。

      【讨论】:

      • 我花了一个小时试图找出我做错了什么。谢谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-22
      • 2016-03-16
      • 1970-01-01
      • 1970-01-01
      • 2021-06-03
      相关资源
      最近更新 更多