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会被立刻捕获到。
推荐文章:
关注我的微信公众号
在公众号里留言交流
投稿邮箱:1052839972@qq.com
庭院深深深几许?杨柳堆烟,帘幕无重数。
玉勒雕鞍游冶处,楼高不见章台路。
雨横风狂三月暮。门掩黄昏,无计留春住。
泪眼问花花不语,乱红飞过秋千去。
如果感觉对您有帮助
欢迎向作者提供捐赠
这将是创作的最大动力