我有简单的API控制器,我确实需要返回401.
方法的返回类型不是IActionResult所以我不能只返回Unauthorized()
方法的返回类型不是IActionResult所以我不能只返回Unauthorized()
在这种情况下如何归还未经授权的人?
[Produces("application/json")] public class MyController : Comntroller { public SomeData GetSomeData([FromBody]RequestData data) { if(!CheckAccessCondition(data,GetCurrentUser())) // ?? how to return from here 401 /// } }
UPD:
>使用IActionResult不是一种方法.从一方面来看它不是类型安全的,并且不允许生成C#&我的API的打字稿客户端(现在我正在使用NSwag)
>因为性能而避免抛出异常会很棒(抛出异常是非常昂贵的操作)
>关于检查访问条件的一些更新 – 我需要检查授权用户是否有权使用请求数据进行操作.因此,对于使用一些“类似授权”的属性,在请求数据被反序列化之后进行检查会很棒(为了避免再次进行双重反序列化 – 因为性能)
解决方法
如果你没有IActionResult返回类型的唯一原因是你想要返回json数据,你仍然可以返回它并执行以下操作:
public IActionResult GetSomeData(){ if (condition) return Json(myData); else return Unauthorized(); }
有点hacky,但你也可以简单地返回null并使用HttpContext配置你的响应
public SomeData GetSomeData() { if (condition) return myData; else { HttpContext.Response.StatusCode = 401; return null; } }
如果由于某些原因(例如类型安全性)需要SomeData,则可以选择设置过滤器类.
public class MyAccessAttribute : Attribute,IActionFilter{ public void OnActionExecuting(ActionExecutingContext context) { if (condition) context.Result = new UnauthorizedResult(); } public void OnActionExecuted(ActionExecutedContext context) { } }
然后,您可以在此操作中使用它:
[MyAccess] public SomeData GetSomeData(){
更新
从.netcore 2.1开始,您现在可以使用通用的ActionResult
public ActionResult<SomeData> GetSomeData(){
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。