加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-web-api – 从OWIN中间件更改响应对象

发布时间:2020-12-16 00:45:57 所属栏目:asp.Net 来源:网络整理
导读:我的OWIN中间件就是这样的。 (框架是ASP.NET Web API)。 public class MyMiddleware : OwinMiddleware{ public MyMiddleware(OwinMiddleware next) : base(next) { } public override async Task Invoke(OwinRequest request,OwinResponse response) { var h
我的OWIN中间件就是这样的。 (框架是ASP.NET Web API)。
public class MyMiddleware : OwinMiddleware
{
    public MyMiddleware(OwinMiddleware next) : base(next) { }

    public override async Task Invoke(OwinRequest request,OwinResponse response)
    {
        var header = request.GetHeader("X-Whatever-Header");

        await Next.Invoke(request,response);

        response.SetHeader("X-MyResponse-Header","Some Value");
        response.StatusCode = 403;

    }
}

问题:

>推荐的做法是从OwinMiddleware派生?我看到在Katana源码中,一些中间件类派生自OwinMiddleware,有些不是。
>我可以看到请求头好了在中间件中的Next.Invoke之后设置响应标题或状态代码对返回给客户端的响应没有影响。但是,如果在Next.Invoke调用之前设置了响应头或状态,那么带有头的响应和我设置的状态将返回给客户端。设置这些的正确方法是什么?

解决方法

是的,推荐来自OwinMiddleware。一些中间件类不是从OwinMiddleware派生的原因是,由于最近推出了类,所以它们还没有切换。或者为了避免由于某些原因组件对Microsoft.Owin程序集的依赖。
调用Invoke on Next之后,响应的可能原因设置不起作用,只要任何人开始写入响应主体流,响应HTTP头就会被发送。所以在中间件组件开始写入响应体之后,状态代码或HTTP头的任何更改都不会有任何影响。

您可以尝试的是使用OWIN提供的OnSendingHeaders回调。以下是如何使用它:

public override async Task Invoke(IOwinContext context)
{
   var response = context.Response;
   var request =  context.Request;

   response.OnSendingHeaders(state =>
   {
       var resp = (OwinResponse)state;
       resp.Headers.Add("X-MyResponse-Header","Some Value");
       resp.StatusCode = 403;
       resp.ReasonPhrase = "Forbidden";
    },response);

  var header = request.Headers["X-Whatever-Header"];

  await Next.Invoke(context);
}

感谢biscuit314更新我的答案。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读