Owin中间件获取Response body stream

2020-10-23  乐帮网

owin

Owin中间件设计之初就是建立在页面响应周期之前的,它本质是提升对程序响应的控制能力,方便开发人员随时添加和减少过滤器,比之前MVC时代的filter要方便,况且那种结构也只能适应在IIS托管管道下了,在拥抱NetCore的时代来临之际,Owin这种结构框架势必重出江湖。

首先,如果你有在中间件改写Response Body的需求,那证明你还没有掌握Owin的设计理念,再次可能你是在偷懒或者投机取巧。说到这里说明改写Response Body的方式不是简单能实现的,这里只介绍一个相对简单的读取body中内容来抛砖引玉,功能需求,对于所有权限拒绝的请求捕获取请求体。先从建立一下中间件开始。

 /// <summary>
    /// 自定义中间件
    /// </summary>
    public class MyAuthenticationMiddleware : OwinMiddleware
    {
        /// <summary>
        /// 构造
        /// </summary>
        /// <param name="next"></param>
        public MyAuthenticationMiddleware(OwinMiddleware next) : base(next) { }
        /// <summary>
        /// 调用
        /// </summary>
        /// <param name="context"></param>
        /// <returns></returns>
        public override Task Invoke(IOwinContext context)
        {
            var stream = context.Response.Body;
            var buffer = new MemoryStream();
            context.Response.Body = buffer;
            //Next 就是要验证权限的中间件
            Next.Invoke(context);

            if (context.Response.StatusCode == 401)
            {
            	var reader = new StreamReader(buffer);
            	string responseBody = reader.ReadToEnd();
            	buffer.Seek(0, SeekOrigin.Begin);
                byte[] data = Encoding.UTF8.GetBytes(string responseBody);
                buffer.Write(data,0, data.Length);

            }
            else
            {
                buffer.CopyToAsync(stream);
            }
            return Task.FromResult(0);
        }
    }

在 Startup.cs中添加app.Use<MyAuthenticationMiddleware>(); 放到权限验证前面,大功告成,如果权限验证中间件返回401会被立刻捕获到。

推荐文章:

MVC5 WebApi2 使用OWIN管道管理中间件

Owin中间件获取Response body stream

WebApi2 Owin Autofac Demo

公众号二维码

关注我的微信公众号
在公众号里留言交流
投稿邮箱:1052839972@qq.com

庭院深深深几许?杨柳堆烟,帘幕无重数。
玉勒雕鞍游冶处,楼高不见章台路。
雨横风狂三月暮。门掩黄昏,无计留春住。
泪眼问花花不语,乱红飞过秋千去。

欧阳修

付款二维码

如果感觉对您有帮助
欢迎向作者提供捐赠
这将是创作的最大动力