2017-10-19 152 views
1

我在我的OData控制器定义POST方法:上操作的路径模板不是有效的OData路径模板

[HttpPost] 
    [ODataRoute("Users/BulkUserUpdate/")] 
    public HttpResponseMessage BulkUserUpdate([FromBody] BulkUserUpdateModel bulkModel) 
    { 
     try 
     { 
      foreach (Guid userId in bulkModel.UserIds) 
      { 
       ... 
      } 
      ... 
      return Request.CreateResponse(HttpStatusCode.OK); 
     } 
     catch (Exception e) 
     { 
      ... 
      return Request.CreateResponse(HttpStatusCode.BadRequest); 
     } 
    } 

当启动应用程序,我得到错误:路径模板“用户/ BulkUserUpdate /”上控制器'Users'中的操作'BulkUserUpdate'不是有效的OData路径模板。错误的请求 - 查询语法错误。

我的配置在EntityDataModel:

var userType = builder.EntitySet<UserModel>("Users").EntityType; 
ActionConfiguration bulkUserUpdate = userType.Action("BulkUserUpdate"); 

回答

1

OjamaYellow

按照OData Spec,它说:

要调用绑定到资源的作用,客户端发出一个POST请求的动作URL。可以从先前返回的实体表示获得动作URL,或者通过将名称空间或别名限定的动作名称追加到URL来标识与其类型与绑定类型相同或源自绑定类型的资源行动的参数。

所以,你[ODataRoute("Users/BulkUserUpdate/")]有两个问题:

  1. 你应该使用命名空间限定动作名字来称呼行动。例如:~.. /YourNameSapce.BulkUserUpdate

  2. 您的操作必须为非收集类型,因此您应该对非收集操作进行调用。

所以,正确的属性路由字符串应该是:

[ODataRoute(Users({myKey})/YourNamespace.BulkUserUpdate")] 

和你的控制器方法应该有一个说法在接受“的myKey”。

public HttpResponseMessage BulkUserUpdate([FromODataUri]string myKey, [FromBody] BulkUserUpdateModel bulkModel) 

=========================更新10/20/2017 ============ ===从OjamaYellow

响应:

但如果我不想在我的网址的关键。所以,其实我是想有未绑定的动作

未绑定的动作,你可以直接调用从“制造商”,“行动”的方法,例如:

ActionConfiguration actionConfig = builder.Action("xxx");

结合的作用是通过行动进口称为,按照OData Spec说:

要通过操作导入调用操作,客户端发出POST请求到标识操作导入的URL。操作导入的规范URL是服务根目录,后跟操作导入的名称

所以,正确的属性路由字符串未绑定的动作应该是:

[ODataRoute("yourActionImportName")]

=============更新2017年10月24日==== =====

如果你想使用Users/BulkUserUpdate,那就是绑定到实体集合的行为。

所以,在模型构造器,你应该叫:

var userType = builder.EntitySet<UserModel>("Users").EntityType; 
ActionConfiguration bulkUserUpdate = userType.Collection.Action("BulkUserUpdate"); 

请注意userType后 “收集” 的号召。

此外,请更改控制器中的[ODataRoute(“...”)]。 希望它可以帮助。

+0

但如果我不想在我的网址中输入密钥会怎么样。所以我实际上想要进行无约束的操作 – OjamaYellow

+0

请参阅2017年10月10日的更新 –

+0

这种方式可行,但前提是路由是BulkUserUpdate,但不是如果我拥有我想要的Users/BulkUserUpdate – OjamaYellow