【问题标题】:OData, method get with key not foundOData,未找到密钥的方法
【发布时间】:2021-11-10 20:24:43
【问题描述】:

使用下面的代码,我可以点击(使用 Fiddler):

  • 通过 GET 获取客户:odata/Customers
  • 通过 POST 发布(CustomerModel 客户):odata/Customers
  • 通过 DELETE 删除:odata/Customers(5)

删除方法如下:

public IHttpActionResult Delete([FromODataUri] int key)
{
    Console.WriteLine(key);
}

我按了方法,我得到了钥匙,没问题。

但是我没有用key打get方法(不用key的get方法没问题,我得到完整列表):

// GET: odata/Customers(5)
public IHttpActionResult GetCustomer([FromODataUri] int key)
{
    Console.WriteLine(key);
}

我收到此错误(通过 Fiddler 的响应标头): HTTP/1.1 404 未找到

WebApiConfig 是:

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        ODataModelBuilder builder = new ODataConventionModelBuilder();
        builder.EntitySet<CustomerModel>("Customers");
        builder.EntitySet<EmployeeModel>("Employees");
        config.MapODataServiceRoute(
            routeName: "ODataRoute",
            routePrefix: "odata",
            model: builder.GetEdmModel());
    }
}

【问题讨论】:

  • 你可以尝试调用方法 GetCustomers([FromODataUri] int key) 吗?
  • 我试过了,同样的结果..找不到。
  • Get([FromODataUri] int key) 怎么样?
  • 有效。名为“Get”的方法并使用 odata/Customers(2) 调用,这很奇怪吗?还有我在 VS 创建控制器时给的名字
  • 我已将其发布为答案,以便其他人可以看到它。这很奇怪,但是当使用构建器设置 OData 而不是实体时,事情确实开始变得困难!

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


【解决方案1】:

方法名需要Get才能被OData路由拾取:

Get([FromODataUri] int key)

【讨论】:

    【解决方案2】:

    按照 Web API OData 约定,它应该支持以下两条规则:

    1. HttpMethodName + entityTypeName
    2. HttpMethodName

    约定 #1 的优先级高于约定 #2。

    根据约定,如果您只在控制器中定义以下操作,您将得到 404-NotFound

    GetCustomer([FromODataUri] int key)
    GetCustomers([FromODataUri] int key)
    

    否则,如果您在控制器中至少定义以下操作之一,它应该可以工作:

    GetCustomerModel([FromODataUri] int key)
    Get([FromODataUri] int key)
    

    https://docs.microsoft.com/en-gb/odata/webapi/built-in-routing-conventions 列出了 Web API OData 中使用的路由约定。希望它可以帮助你。谢谢。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-01
      • 2014-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-18
      • 1970-01-01
      • 2015-03-27
      相关资源
      最近更新 更多