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

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

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

编写中间件需要引入

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. Centos6.6下安装nginx1.6.3

    安装环境: [root@nginx ~]# cat /etc/redhat-release CentOS release 6.6 (Final) [root@nginx ~]# uname -r 2. ...

  2. NO.3day 网络基础

    网络基础 1.互联网协议 概念:通过互联网传输数据的标准. 功能:定义计算机如何接入internet,以及接入internet的计算机通信的标准. 2.OSI五层模型 应用层--传输层--网络层--数 ...

  3. ElasticStack系列之十五 & query cache 引起性能问题思考

    问题描述 一个线上集群,执行的 Query DSL 都是一样的,只是参数不同.统计数据显示 98% ~ 99% 的查询相应速度都很快,只需要 4 ~ 6ms,但是有 1% 左右的查询响应时间在 100 ...

  4. linux下yum错误:[Errno 14] problem making ssl connection Trying other mirror.

    今天是要yum命令安装EPEL仓库后 yum install epel-release 突然发现yum安装其他的软件出错. 错误:[Errno 14] problem making ssl conne ...

  5. 搞ACM的你伤不起[转载] 原作者:RoBa

    劳资六年前开始搞ACM啊!!!!!!!!!! 从此踏上了尼玛不归路啊!!!!!!!!!!!! 谁特么跟劳资讲算法是程序设计的核心啊!!!!!! 尼玛除了面试题就没见过用算法的地方啊!!!!!! 谁再跟 ...

  6. c# 的一些基本操作或属性

    http下载文件,不保存到服务器,直接使用浏览器下载 /// <summary> /// 根据url下载文件 /// </summary> /// <param name ...

  7. Overfitting & Regularization

    Overfitting & Regularization The Problem of overfitting A common issue in machine learning or ma ...

  8. Maven项目中通过profile定义使不同环境使用不同配置信息

    profile可以让我们定义一系列的配置信息,然后指定其激活条件.这样我们就可以定义多个profile,然后每个profile对应不同的激活条件和配置信息,从而达到不同环境使用不同配置信息的效果.比如 ...

  9. java正则:不包含某个规则字符串【转】

    概述 做日志分析工作的经常需要跟成千上万的日志条目打交道,为了在庞大的数据量中找到特定模式的数据,常常需要编写很多复杂的正则表达式.例如枚举出日志文件中不包含某个特定字符串的条目,找出不以某个特定字符 ...

  10. IIS 无法显示网页问题

    今天服务器上的项目突然无法访问,之前也碰到过,都是重启服务器解决的,因为重启IIS无效,另外检查发现w3wp.exe进程正常,其他端口及相关的都没什么问题,最后无奈只能想到用重启来解决了,今天又出现这 ...