前面一篇文章简单的介绍了中间件的应用

下面编写一个自定义的中间件类库,并加入中间件参数以及引入日志记录中间件的异常

下面来看下中间件的构造,参数可以自定义 这里我定义了一个参数类

编写中间件需要引入

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)中间件进阶的更多相关文章

  1. ASP.NET MVC随想录——创建自定义的Middleware中间件

    经过前2篇文章的介绍,相信大家已经对OWIN和Katana有了基本的了解,那么这篇文章我将继续OWIN和Katana之旅——创建自定义的Middleware中间件. 何为Middleware中间件 M ...

  2. 创建自定义的Middleware中间件

    创建自定义的Middleware中间件 阅读目录 何为Middleware中间件 使用Inline方式注册Middleware 使用Inline+ AppFunc方式注册Middleware 定义原生 ...

  3. 自定义Django的中间件

    分析Django的生命周期,我们知道所有的http请求都要经过Django的中间件. 假如现在有一个需求,所有到达服务端的url请求都在系统中记录一条日志,该怎么做呢? Django的中间件的简介 D ...

  4. {Django基础九之中间件} 一 前戏 二 中间件介绍 三 自定义中间件 四 中间件的执行流程 五 中间件版登陆认证

    Django基础九之中间件 本节目录 一 前戏 二 中间件介绍 三 自定义中间件 四 中间件的执行流程 五 中间件版登陆认证 六 xxx 七 xxx 八 xxx 一 前戏 我们在前面的课程中已经学会了 ...

  5. Owin 自定义中间件

    /// <summary> /// 自定义的中间件 /// </summary> public class CustomMiddleware : OwinMiddleware ...

  6. Python学习(三十七)—— 模板语言之自定义filter和中间件

    一.模板语言之自定义filter 自定义filter文件存放位置 模板中自定义函数 - 在已注册的app中创建一个名字叫 templatetags 文件夹 - 任意创建一个py文件 - 创建名字交 r ...

  7. ASP.NET Core 中间件 自定义全局异常中间件以及 MVC异常过滤器作用

    中间件是一种装配到应用管道以处理请求和响应的软件. 每个组件: 选择是否将请求传递到管道中的下一个组件. 可在管道中的下一个组件前后执行工作. 请求委托用于生成请求管道. 请求委托处理每个 HTTP ...

  8. django中间件及中间件实现的登录验证

    1.定义 一个用来处理Django的请求和响应的框架级别的钩子(函数),相对比较轻量级,并且在全局上改变django的输入与输出(使用需谨慎,否则影响性能) 直白的说中间件就是帮助我们在视图函数执行之 ...

  9. 什么是中间件?中间件和java应用关系是什么

    中间件,比如websphere 是一种独立的系统软件,你的java应用要通过它来管理,比如数据库连接,消息通信等,中间件位于操作系统之上.简单滴说,你不可能直接把你的java应用部署在操作系统上,得由 ...

随机推荐

  1. GO_01:Linux-CentOS之Go语言环境配置

    1.下载安装 下载当前最新版本,通过wget命令,当然你也可以手动下载之后再传入到Linux中,都可以. 本文安装的是1.8版本.由于Go语言的要求,需要配置gopath,而对应再gopath里按照g ...

  2. JavaScript 数组元素排序

    var sortArray = new Array(3,6,8888,66); // 元素必须是数字 sortArray.sort(function(a,b){return a-b}); // a-b ...

  3. LintCode 383: Max Area

    LintCode 383: Max Area 题目描述 给定 n 个非负整数 a1, a2, ..., an, 每个数代表了坐标中的一个点 (i, ai).画 n 条垂直线,使得 i 垂直线的两个端点 ...

  4. 【CodeForces】906 D. Power Tower 扩展欧拉定理

    [题目]D. Power Tower [题意]给定长度为n的正整数序列和模数m,q次询问区间[l,r]累乘幂%m的答案.n,q<=10^5,m,ai<=10^9. [算法]扩展欧拉定理 [ ...

  5. 20155227 2016-2017-2 《Java程序设计》第四周学习总结

    20155227 2016-2017-2 <Java程序设计>第四周学习总结 教材学习内容总结 继承 继承 继承是Java程序设计语言面向对象的又一重要体现,允许子类继承父类,避免重复的行 ...

  6. 嵌入式Linux系统挂载NFS系统

    在建立交叉编译环境的时候,经常需要网嵌入式Linux环境中拷贝文件,nfs网络共享文件系统是一种很方便的方式. 在嵌入式Linux挂载nfs系统,需要用到如下命令: mount -t nfs -o n ...

  7. 七牛云 上传图片 https 修改Nginx 注意事项

    仅在这记录下,今天的事情. 问题出自于Nginx 设置http 强制跳转 https设置 1.上午,出于某些需求,我将服务器Nginx 设置http 强行跳转 https server { liste ...

  8. 18、Random类简介

    Random类概述 Random类在java.util包下,使用这个类可以生成随机数 package com.sutaoyu.usually_class; import java.util.Rando ...

  9. iOS学习笔记(3)— 屏幕旋转

    一.屏幕旋转机制: iOS通过加速计判断当前的设备方向和屏幕旋转.当加速计检测到方向变化的时候,屏幕旋转的流程如下: 1.设备旋转时,系统接收到旋转事件. 2.系统将旋转事件通过AppDelegate ...

  10. 浅析XSS与XSSI异同

    浅析XSS与XSSI异同 这篇文章主要介绍了XSS与XSSI异同,跨站脚本(XSS)和跨站脚本包含(XSSI)之间的区别是什么?防御方法有什么不同?感兴趣的小伙伴们可以参考一下 Michael Cob ...