操作上的路径模板不是有效的 OData 路径模板
The path template on the action is not a valid OData path template
我已经在我的 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);
}
}
启动应用程序时出现错误:控制器 'Users' 中操作 'BulkUserUpdate' 的路径模板 'Users/BulkUserUpdate/' 不是有效的 OData 路径模板。错误请求 - 查询语法错误。
我在 EntityDataModel 中的配置:
var userType = builder.EntitySet<UserModel>("Users").EntityType;
ActionConfiguration bulkUserUpdate = userType.Action("BulkUserUpdate");
OjamaYellow
关注OData Spec,它说:
要调用绑定到资源的操作,客户端向操作 URL 发出 POST 请求。动作 URL 可以从先前返回的实体表示中获得,或者通过将 命名空间或别名限定的 动作名称附加到标识资源的 URL 来构造其类型与操作的绑定参数类型相同或派生自该类型。
所以,你的 [ODataRoute("Users/BulkUserUpdate/")]
有两个问题:
您应该使用命名空间限定的动作名称来调用动作。例如:~.. /YourNameSapce.BulkUserUpdate
你的action绑定了非collection类型,所以你应该调用非collection类型的action。
所以,正确的属性路由字符串应该是:
[ODataRoute(Users({myKey})/YourNamespace.BulkUserUpdate")]
并且您在控制器中的方法应该有一个参数来接受 "myKey"。
public HttpResponseMessage BulkUserUpdate([FromODataUri]string myKey, [FromBody] BulkUserUpdateModel bulkModel)
=========================更新 10/20/2017============== =
OjamaYellow 的回复:
但是如果我不想在 url 中输入密钥怎么办?所以我其实很想有unbound action
对于未绑定的动作,可以直接从"builder"调用"Action"方法,例如:
ActionConfiguration actionConfig = builder.Action("xxx");
unbound action是通过action import调用的,Follow OData Spec says:
要通过动作导入调用动作,客户端会向 URL 标识动作导入发出 POST 请求。操作导入的规范 URL 是服务根,后跟 操作导入的名称。
所以,未绑定操作的正确属性路由字符串应该是:
[ODataRoute("yourActionImportName")]
=============2017 年 10 月 24 日更新=========
如果要使用Users/BulkUserUpdate
,就是绑定实体集合的动作。
因此,在模型构建器中,您应该调用:
var userType = builder.EntitySet<UserModel>("Users").EntityType;
ActionConfiguration bulkUserUpdate = userType.Collection.Action("BulkUserUpdate");
请注意"Collection"在userType
之后调用。
此外,请更改控制器中的 [ODataRoute("...")]。
希望对你有帮助。
我已经在我的 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);
}
}
启动应用程序时出现错误:控制器 'Users' 中操作 'BulkUserUpdate' 的路径模板 'Users/BulkUserUpdate/' 不是有效的 OData 路径模板。错误请求 - 查询语法错误。
我在 EntityDataModel 中的配置:
var userType = builder.EntitySet<UserModel>("Users").EntityType;
ActionConfiguration bulkUserUpdate = userType.Action("BulkUserUpdate");
OjamaYellow
关注OData Spec,它说:
要调用绑定到资源的操作,客户端向操作 URL 发出 POST 请求。动作 URL 可以从先前返回的实体表示中获得,或者通过将 命名空间或别名限定的 动作名称附加到标识资源的 URL 来构造其类型与操作的绑定参数类型相同或派生自该类型。
所以,你的 [ODataRoute("Users/BulkUserUpdate/")]
有两个问题:
您应该使用命名空间限定的动作名称来调用动作。例如:
~.. /YourNameSapce.BulkUserUpdate
你的action绑定了非collection类型,所以你应该调用非collection类型的action。
所以,正确的属性路由字符串应该是:
[ODataRoute(Users({myKey})/YourNamespace.BulkUserUpdate")]
并且您在控制器中的方法应该有一个参数来接受 "myKey"。
public HttpResponseMessage BulkUserUpdate([FromODataUri]string myKey, [FromBody] BulkUserUpdateModel bulkModel)
=========================更新 10/20/2017============== =
OjamaYellow 的回复:
但是如果我不想在 url 中输入密钥怎么办?所以我其实很想有unbound action
对于未绑定的动作,可以直接从"builder"调用"Action"方法,例如:
ActionConfiguration actionConfig = builder.Action("xxx");
unbound action是通过action import调用的,Follow OData Spec says:
要通过动作导入调用动作,客户端会向 URL 标识动作导入发出 POST 请求。操作导入的规范 URL 是服务根,后跟 操作导入的名称。
所以,未绑定操作的正确属性路由字符串应该是:
[ODataRoute("yourActionImportName")]
=============2017 年 10 月 24 日更新=========
如果要使用Users/BulkUserUpdate
,就是绑定实体集合的动作。
因此,在模型构建器中,您应该调用:
var userType = builder.EntitySet<UserModel>("Users").EntityType;
ActionConfiguration bulkUserUpdate = userType.Collection.Action("BulkUserUpdate");
请注意"Collection"在userType
之后调用。
此外,请更改控制器中的 [ODataRoute("...")]。 希望对你有帮助。