ASP.NET web api中的OData V3操作不';我拿不到扳机

ASP.NET web api中的OData V3操作不';我拿不到扳机,odata,asp.net-web-api-odata,Odata,Asp.net Web Api Odata,我正在使用asp.net和webapi 2.2的OData V3端点。我用它成功地实施了CRUD操作。现在,我想添加一些自定义操作以及CRUD操作。我跟随文章()使用ODatav3和WebAPI创建了操作 我打字的时候 URI: 它抛出以下错误: <m:error><m:code/><m:message xml:lang="en-US">No HTTP resource was found that matches the request URI 'http:

我正在使用asp.net和webapi 2.2的OData V3端点。我用它成功地实施了CRUD操作。现在,我想添加一些自定义操作以及CRUD操作。我跟随文章()使用ODatav3和WebAPI创建了操作

我打字的时候

URI:

它抛出以下错误:

<m:error><m:code/><m:message xml:lang="en-US">No HTTP resource was found that matches the request URI 'http://localhost:55351/odata/Courses(1101)/AlterCredits'.</m:message><m:innererror><m:message>No routing convention was found to select an action for the OData path with template '~/entityset/key/unresolved'.</m:message><m:type/><m:stacktrace/></m:innererror></m:error>
我在网上做过研究,发现了这个链接。但这是为OData V4准备的。我正在使用ODataV3和Action


谢谢,

首先,您的操作
AlterCredits
定义为:

ActionConfiguration atlerCredits = modelBuilder.Entity<Course>().Collection.Action("AlterCredits");
public async Task<IHttpActionResult> AlterCredits([FromODataUri] int key, ODataActionParameters parameters)
{
...
}
这意味着
AlterCredits
收听对
课程
实体的调用

因此,您得到了未找到HTTP资源错误消息


根据您的示例代码,我创建了一个示例方法供您参考:

[HttpPost]
public async Task<IHttpActionResult> AlterCredits(ODataActionParameters parameters)
{
    if (!ModelState.IsValid)
        return BadRequest();

    object value;
    if (parameters.TryGetValue("Credit", out value))
    {
        int credits = (int)value;
        credits = credits + 3;
        return Ok(credits);
    }

    return NotFound();
}
您可以得到如下响应:

{
  "d":{
    "AlterCredits":12
  }
}

关于您的问题:

  • IList conventions=ODataRoutingConventions.CreateDefault()//我需要这个吗

    回答:不,你不需要。仅将默认值用作:

    MapODataServiceRoute(“ODataRoute”,“odata”,GetModel())

  • //[ODataRoute(“AlterCredits(key={key},credit={credit})”)]

    回答:不,绑定操作不需要ODataRoute属性

  • 谢谢

    ActionConfiguration atlerCredits = modelBuilder.Entity<Course>().Collection.Action("AlterCredits");
    
    public async Task<IHttpActionResult> AlterCredits([FromODataUri] int key, ODataActionParameters parameters)
    {
    ...
    }
    
    [HttpPost]
    public async Task<IHttpActionResult> AlterCredits(ODataActionParameters parameters)
    {
        if (!ModelState.IsValid)
            return BadRequest();
    
        object value;
        if (parameters.TryGetValue("Credit", out value))
        {
            int credits = (int)value;
            credits = credits + 3;
            return Ok(credits);
        }
    
        return NotFound();
    }
    
    POST ~/odata/Courses/AlterCredits
    Content-Type: application/json;odata=verbose
    Content: {"Credit":9}
    
    {
      "d":{
        "AlterCredits":12
      }
    }