具有多个动词的OData自定义动作

问题描述

我们最近将OData从v6升级到了v7,当人们访问某些应返回401或400却返回500的端点时遇到了问题。

示例。 构造动作

builder.EntityType<MyObject>().Action("CustomAction");

控制器

[AcceptVerbs("POST","PATCH","PUT")]
[Route("v1/MyObject({id})/CustomAction")]
public async Task<IHttpActionResult> CustomAction([FromODataUri] int id)

[HttpDelete]
[Route("v1/MyObject({id})/CustomAction")]
public async Task<IHttpActionResult> DeleteCustomAction([FromODataUri] int id)

当请求有效时,端点可以正常工作。但是,如果用户未通过身份验证或请求不正确,则将返回500而不是401或400。

例如,如果我传递了错误的访问令牌,我将得到一个异常

The request must have an associated OData route name. Consider using the extension request.ODataProperties().RouteName to set a route name.

StackTrace:    at Microsoft.AspNet.OData.Extensions.UrlHelperExtensions.CreateODataLink(UrlHelper urlHelper,IList`1 segments)

但是如果传递有效的访问令牌,则端点可以正常工作。

我已经尝试过使用[ODaTaroute(“ MyObject({id})/ CustomAction”))],但这不起作用,它只会导致404

我唯一能想到的是MyObject确实有一个名为CustomActions的NonExpandable集合,是否有可能导致ODaTaroute失败?

我最终需要的是一个自定义操作,该操作可以接受非常特定的URL上的PUT,POST,PATCH,DELETE v1 / MyObject(id)/ CustomAction,在应有的情况下将返回401或400。有效的请求可以正常工作。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)