【问题标题】:WebAPI OData v4 custom action without parameters can't be routed with error "No routing convention was found..."无法路由不带参数的 WebAPI OData v4 自定义操作,并出现错误“未找到路由约定...”
【发布时间】:2016-08-16 09:55:53
【问题描述】:

我有一个非常简单的 OData 控制器,可以成功处理标准操作(至少 GET、POST、PUT 和 DELETE 方法有效)。我关注了this tutorial 并添加了简单的绑定操作。该方法有参数参数,但实际上它不需要参数:

[HttpPost]
public IHttpActionResult Close([FromODataUri] int key, ODataActionParameters parameters) {
  return Ok();
}

我在 OData EDM 配置中定义了这个动作如下:

builder.EntitySet<Ticket>("tickets");
builder.EntityType<Ticket>().Action("Close");

我正在尝试向邮递员发起行动:

POST /odata/tickets(2)/Default.Close HTTP/1.1
Host: localhost:50477
Accept: application/json
Content-Type: application/json
Cache-Control: no-cache
Postman-Token: eef4c1f6-8c7f-f5eb-c22d-4397f3bda170

但是收到错误信息:

{
  "error": {
    "code": "",
    "message": "No HTTP resource was found that matches the request URI 'http://localhost:50477/odata/tickets(2)/default.close'.",
    "innererror": {
      "message": "No routing convention was found to select an action for the OData path with template '~/entityset/key/unresolved'.",
      "type": "",
      "stacktrace": ""
    }
  }
}

我已阅读整个互联网和所有关于 SO 的相关文章,但无法解决此问题。请帮助我,因为我没有任何新的想法如何解决这个问题。

【问题讨论】:

  • 你的 WebAPI/OData 版本是什么,你能分享你的元数据吗,我仍然无法重现你的问题。
  • OData v4,WebApi 2.2。请查看元数据:pastebin.com/MuPzFPxe
  • 您发送给控制器的 JSON 是什么?
  • 我找到了错误的原因 - 不正确的重写规则。当我禁用所有重写规则时,所有测试都通过了。

标签: asp.net-web-api odata


【解决方案1】:

我的控制器:

public class TicketsController : ODataController
{
    [HttpPost]
    public IHttpActionResult Close([FromODataUri] int key, ODataActionParameters parameters)
    {
        return Ok();
    }
}

我的要求:

        string requestUri = "http://localhost/odata/tickets(2)/Default.Close";

        HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, requestUri);
        request.Content = new StringContent("",
                                Encoding.UTF8,
                                "application/json");
        HttpResponseMessage response = _client.SendAsync(request).Result;

或者去掉close方法中的ODataActionParameters parameters,调用:

        string requestUri = "http://localhost/odata/tickets(2)/Default.Close";

        HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, requestUri);
        HttpResponseMessage response = _client.SendAsync(request).Result;

我的 EdmModel 正在使用您的模型。

【讨论】:

  • 感谢您的尝试,但是... 似乎上面列出的所有内容都是相同的,但其他内容会产生负面影响。我仍然看到“未找到与请求 URI 'localhost:50477/odata/tickets(2)/default.close' 匹配的 HTTP 资源。”我不知道去哪里找。
猜你喜欢
  • 2023-03-04
  • 2017-05-20
  • 1970-01-01
  • 1970-01-01
  • 2017-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-10
相关资源
最近更新 更多