Owin 自定义中间件(2)中间件进阶
前面一篇文章简单的介绍了中间件的应用
下面编写一个自定义的中间件类库,并加入中间件参数以及引入日志记录中间件的异常
下面来看下中间件的构造,参数可以自定义 这里我定义了一个参数类
编写中间件需要引入
Owin
Microsoft.Owin;
中间件类需要继承类:OwinMiddleware
/// <summary>
/// 自定义的中间件
/// </summary>
public class CustomMiddleware : OwinMiddleware
{
CustomMiddlewareParameters _parameter;
public CustomMiddleware(OwinMiddleware next, CustomMiddlewareParameters parameter) : base(next)
{
_parameter = parameter;
}
public override Task Invoke(IOwinContext c)
{
if (Next != null)
{
try
{
var cookie = c.Request.Cookies.ToList();
string allcookie = string.Empty;
string allenvi = string.Empty;
foreach (var cok in cookie)
{
allcookie += cok.Key + "---------------" + cok.Value + "<br />";
c.Environment.Add(cok.Key, cok.Value);
} foreach (var envi in c.Environment)
{
allenvi += envi.Key + "---------------" + envi.Value + "<br />";
} var msg = Encoding.UTF8.GetBytes(allcookie + "<br /><br /><br /><br /><br /><br />" + allenvi);
c.Response.ContentType = "text/html; charset=utf-8";
c.Response.Write(msg, , msg.Length); //处理操作
return Next.Invoke(c);
}
catch (Exception ex)
{
_parameter.logs.Error(ex.Message);
}
}
return Task.FromResult<int>();
} }
这里我获取了cookies 以及 设置或获取 IOwinContext上下文中的环境变量,那么这里就可以搞事情了
我可以处理cookies 添加设置环境变量中的值 或者根据Request Response中的做处理,或者这个中间件做一些事情 另外其他中间件来搞事情,但是要注意中间件引用的顺序
下面看下我的参数类:CustomMiddlewareParameters
public class CustomMiddlewareParameters
{
public ILog logs { get; } public string siteName { get; set; }
public LYMOptions lymOptions { get; set; }
public CustomMiddlewareParameters()
{
log4net.Config.XmlConfigurator.ConfigureAndWatch(new FileInfo(AppDomain.CurrentDomain.BaseDirectory + "Log4Net.config"));
this.logs = LogManager.GetLogger("CustomMiddlewareParameters");
this.lymOptions = new LYMOptions();
} internal void Validate()
{
if (siteName == null)
{
throw new ArgumentException("参数siteName不能设置为Null");
}
if (lymOptions == null)
{
throw new ArgumentException("参数cookieOptions不能设置为Null");
} } }
参数里面可以引入更多的参数,看实际业务需求,这里我随便定义了一些,同时这里可以验证参数等操作,我写了几个异常未来抛出日志
这里日志我引入了Log4.Net 包 当然也用可以用其他的 包括自己写一些
做好这一步,那么我来写一个扩展类 扩展IAppbuilder
public static class CustomMiddlewareExtentions
{
public static IAppBuilder UseLYMMiddleware(this IAppBuilder builder, CustomMiddlewareParameters customParmeters)
{
try
{
customParmeters.Validate();
builder.Use<CustomMiddleware>(customParmeters);
}
catch (Exception ex)
{
customParmeters.logs.Error(ex.Message);
}
return builder;
} }
可以捕获一些异常情况,这句是中关键件的关键 builder.Use<CustomMiddleware>(customParmeters);
CustomMiddleware 为自定义的中间件类,参数为 params object []
到这里中间件基本就写好了
下来就是用:
在Web应用中引用 Microsoft.Owin.Host.SystemWeb
在Web寄宿类中添加 中间件引用就ok了
app.UseLYMMiddleware(new CustomMiddlewareParameters());
这里我没有添加参数 会报错,查看日志的生成情况,这里需要配置下日志的XML
检查下日志已搞定
接下来看下正常情况是什么,中间件里面我输处理日志信息 以及 中间件环境变量信息
下面看下上面的信息,在中间里面就可以搞事情了比如:参数相关,中间件上下文对象都封装有这个IOwinContext对象
接下来看下这个中间件里面的参数
//
// 摘要:
// Gets the Authentication middleware functionality available on the current request.
//
// 返回结果:
// The authentication middleware functionality available on the current request.
IAuthenticationManager Authentication { get; }
//
// 摘要:
// Gets the OWIN environment.
//
// 返回结果:
// The OWIN environment.
IDictionary<string, object> Environment { get; }
//
// 摘要:
// Gets a wrapper exposing request specific properties.
//
// 返回结果:
// A wrapper exposing request specific properties.
IOwinRequest Request { get; }
//
// 摘要:
// Gets a wrapper exposing response specific properties.
//
// 返回结果:
// A wrapper exposing response specific properties.
IOwinResponse Response { get; }
//
// 摘要:
// Gets or sets the host.TraceOutput environment value.
//
// 返回结果:
// The host.TraceOutput TextWriter.
TextWriter TraceOutput { get; set; } //
// 摘要:
// Gets a value from the OWIN environment, or returns default(T) if not present.
//
// 参数:
// key:
// The key of the value to get.
//
// 类型参数:
// T:
// The type of the value.
//
// 返回结果:
// The value with the specified key or the default(T) if not present.
T Get<T>(string key);
//
// 摘要:
// Sets the given key and value in the OWIN environment.
//
// 参数:
// key:
// The key of the value to set.
//
// value:
// The value to set.
//
// 类型参数:
// T:
// The type of the value.
//
// 返回结果:
// This instance.
IOwinContext Set<T>(string key, T value);
Authentication:授权相关
Environment:上下文环境值 IDictionary<string, object> 这个类型
OwinRequest Request :封装的请求对象
IOwinResponse Response 请求的响应对象
以及一个 Get Set 方法 这是设置 OWIN environment中的值
还有对输出处理 TraceOutput
中间件想一个生产企业的流水线一样,一次请求过来 经过流水线(不同的中间件)加工处理,最后到生产出产品就相当于网页的Reponse响应
Owin 自定义中间件(2)中间件进阶的更多相关文章
- ASP.NET MVC随想录——创建自定义的Middleware中间件
经过前2篇文章的介绍,相信大家已经对OWIN和Katana有了基本的了解,那么这篇文章我将继续OWIN和Katana之旅——创建自定义的Middleware中间件. 何为Middleware中间件 M ...
- 创建自定义的Middleware中间件
创建自定义的Middleware中间件 阅读目录 何为Middleware中间件 使用Inline方式注册Middleware 使用Inline+ AppFunc方式注册Middleware 定义原生 ...
- 自定义Django的中间件
分析Django的生命周期,我们知道所有的http请求都要经过Django的中间件. 假如现在有一个需求,所有到达服务端的url请求都在系统中记录一条日志,该怎么做呢? Django的中间件的简介 D ...
- {Django基础九之中间件} 一 前戏 二 中间件介绍 三 自定义中间件 四 中间件的执行流程 五 中间件版登陆认证
Django基础九之中间件 本节目录 一 前戏 二 中间件介绍 三 自定义中间件 四 中间件的执行流程 五 中间件版登陆认证 六 xxx 七 xxx 八 xxx 一 前戏 我们在前面的课程中已经学会了 ...
- Owin 自定义中间件
/// <summary> /// 自定义的中间件 /// </summary> public class CustomMiddleware : OwinMiddleware ...
- Python学习(三十七)—— 模板语言之自定义filter和中间件
一.模板语言之自定义filter 自定义filter文件存放位置 模板中自定义函数 - 在已注册的app中创建一个名字叫 templatetags 文件夹 - 任意创建一个py文件 - 创建名字交 r ...
- ASP.NET Core 中间件 自定义全局异常中间件以及 MVC异常过滤器作用
中间件是一种装配到应用管道以处理请求和响应的软件. 每个组件: 选择是否将请求传递到管道中的下一个组件. 可在管道中的下一个组件前后执行工作. 请求委托用于生成请求管道. 请求委托处理每个 HTTP ...
- django中间件及中间件实现的登录验证
1.定义 一个用来处理Django的请求和响应的框架级别的钩子(函数),相对比较轻量级,并且在全局上改变django的输入与输出(使用需谨慎,否则影响性能) 直白的说中间件就是帮助我们在视图函数执行之 ...
- 什么是中间件?中间件和java应用关系是什么
中间件,比如websphere 是一种独立的系统软件,你的java应用要通过它来管理,比如数据库连接,消息通信等,中间件位于操作系统之上.简单滴说,你不可能直接把你的java应用部署在操作系统上,得由 ...
随机推荐
- bzoj千题计划164:bzoj5123: 线段树的匹配
http://www.lydsy.com/JudgeOnline/upload/201712/prob12.pdf dp[len][0/1] 表示节点表示区间长度为len,节点选/不选的 最大匹配 s ...
- Lua 错误 收集
不存在的变量或者变量没有定义,提示错误 // :: [error] #: * lua entry thread aborted: runtime error: /opt/openresty/nginx ...
- 【重要】Nginx模块Lua-Nginx-Module学习笔记(三)Nginx + Lua + Redis 已安装成功(非openresty 方式安装)
源码地址:https://github.com/Tinywan/Lua-Nginx-Redis 一. 目标 使用Redis做分布式缓存:使用lua API来访问redis缓存:使用nginx向客户端提 ...
- xpath定位中详解id 、starts-with、contains、text()和last() 的用法
1.XPATH使用方法 使用XPATH有如下几种方法定位元素(相比CSS选择器,方法稍微多一点): a.通过绝对路径定位元素(不推荐!) WebElement ele = driver.findEle ...
- spring-mvc Mybatis插件打印SQL
代码: package com.chainup.exchange.service.adapter; import com.chainup.exchange.service.impl.AccountSe ...
- 【leetcode 简单】 第八十三题 反转字符串中的元音字母
编写一个函数,以字符串作为输入,反转该字符串中的元音字母. 示例 1: 输入: "hello" 输出: "holle" 示例 2: 输入: "leet ...
- 使用 TypeScript 改造构建工具及测试用例
最近的一段时间一直在搞TypeScript,一个巨硬出品.赋予JavaScript语言静态类型和编译的语言. 第一个完全使用TypeScript重构的纯Node.js项目已经上线并稳定运行了. 第二个 ...
- 南京邮电大学 CTF 逆向部分 Writeup
Hello,RE! 提示 IDA 中按 R . Google 到 IDA 中 R 快捷键是 Character ,转为字符串. 丢进 IDA(虽然我并不会使用 IDA 有个 strcmp 函数,比较 ...
- 收集了一些python的文章
来自: 戴铭 2010-08-31 17:52:31 newthreading - safer concurrency for Python 安全并发(1回应) http://www.starming ...
- margin-bottom无效问题以及div里内容动态居中样式!
最近调前端样式时候,遇到一个需求,在中间文字不对等的情况下想让下面的操作文字距离底部对齐,如图: , 刚开始觉得使用margin-bottom就可以,后来发现只有margin-top是管用的,查了资料 ...