我在OData控制器中定义了POST方法:
[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");
答案 0 :(得分:1)
OjamaYellow
关注OData Spec,它说:
要调用绑定到资源的操作,客户端会向操作URL发出POST请求。可以从先前返回的实体表示获得动作URL,或者通过将名称空间或别名限定的动作名称附加到URL来标识与其类型相同或源自的资源,动作的绑定参数的类型。
因此,您的[ODataRoute("Users/BulkUserUpdate/")]
有两个问题:
您应该使用名称空间限定的操作名称来调用操作。例如:~.. /YourNameSapce.BulkUserUpdate
您的操作绑定到非集合类型,因此您应该对非集合调用操作。
因此,正确的属性路由字符串应为:
[ODataRoute(Users({myKey})/YourNamespace.BulkUserUpdate")]
你控制器中的方法应该有一个参数来接受“myKey”。
public HttpResponseMessage BulkUserUpdate([FromODataUri]string myKey, [FromBody] BulkUserUpdateModel bulkModel)
=========================更新10/20/2017 =============== < / p>
OjamaYellow的回应:
但如果我不想在我的网址中输入密钥怎么办?所以我实际上想要有未绑定的动作
对于未绑定的操作,您可以直接从“构建器”调用“操作”方法,例如:
ActionConfiguration actionConfig = builder.Action("xxx");
通过操作导入调用未绑定的操作,关注OData Spec说:
通过操作导入调用操作,客户端向标识操作导入的URL发出POST请求。操作导入的规范URL是服务根,后跟操作导入的名称。
因此,未绑定操作的正确属性路由字符串应为:
[ODataRoute("yourActionImportName")]
============= update 10/24/2017 =========
如果你想使用Users/BulkUserUpdate
,那就是限制在实体集合上的行动。
因此,在模型构建器中,您应该调用:
var userType = builder.EntitySet<UserModel>("Users").EntityType;
ActionConfiguration bulkUserUpdate = userType.Collection.Action("BulkUserUpdate");
请注意userType
之后的“收集”来电。
另外,请更改控制器中的[ODataRoute(“...”)]。 希望它可以提供帮助。