文档章节

OWIN之中间件用法示例

李朝强
 李朝强
发布于 2017/03/26 19:16
字数 1330
阅读 116
收藏 0

    这里就直接进入主题了,关于OWIN中间件的介绍,在此不做过多阐述。以控制台为示例,向大家演示了如何使用OWIN的中间件。

首先我们需要应用的类库有:

  • Owin
  • Microsoft.Owin
  • Microsoft.Owin.Hosting
  • Microsoft.Owin.Host.HttpListener

以上类库,nuget引用即可。

其次,给控制台程序,添加一个应用程序启动类。

using System;
using System.Threading.Tasks;
using Microsoft.Owin;
using Owin;
using MiddleWareApp.Extensions;//引用扩展类
/******************************************************************************************************************
 * 
 * 
 * 说 明: 应用程序启动类(版本:Version1.0.0)
 * 作 者:李朝强
 * 日 期:2015/05/19
 * 修 改:
 * 参 考:http://my.oschina.net/lichaoqiang/
 * 备 注:暂无...
 * 
 * 
 * ***************************************************************************************************************/
[assembly: OwinStartup(typeof(MiddleWareApp.Startup1))]

namespace MiddleWareApp
{

    /// <summary>
    /// 启动类
    /// </summary>
    public class Startup1
    {
        /// <summary>
        /// 
        /// </summary>
        /// <param name="app"></param>
        public void Configuration(IAppBuilder app)
        {

            //app.Use<MiddleWare.CustomMiddleWare>();--POST
            //app.Use(typeof(MiddleWare.CustomMiddleWare));//注册自定义中间件
            //app.Use(typeof(MiddleWare.StaticMiddleWare));//注册第二个中间件

            app.UseCustomMiddleWare(new CustomOptions()
            {
                //自定义配置信息
                Name = "CustomMiddleWare"
            });

            app.UseStaticMiddleWare(new StaticOptions()
            {

            });

            app.Run((context) =>
            {
                context.Response.ContentType = "text/plain";
                Console.WriteLine("来自请求:{0}", context.Request.Uri);
                return context.Response.WriteAsync("000");
            });
        }
    }
}

在控制台主程序函数中,启动WebApp。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Owin.Hosting;

namespace MiddleWareApp
{
    class Program
    {

        /// <summary>
        /// 主程序
        /// </summary>
        /// <param name="args"></param>
        private static void Main(string[] args)
        {
            using (WebApp.Start<Startup1>(new StartOptions("http://localhost:9966/")
            {
           
            }))
            {
                Console.WriteLine("OWIN服务器已经启动!按任意键退出");
                Console.ReadLine();
            }
        }
    }
}

这里尝试监听,监听端口9966。需要注意的是,WebApp.Start方法,返回的是一个集成IDsipose接口的对象,我们如果要监听HTTP请求,使用using的时候,注意,它一旦释放,客户端请求将失败,道理很简单,就是不能把WebApp.Start方法启动后返回的对象给释放了,否则,一切监听和中间件将无济于事。

我这里定义了两个中间件,分别为CustomMiddleWareStaticMidlleWare。于此同时,我为了使用中间件的选项参数,定义了一个中间件基类MiddleWareBase(抽象类)。CustomMiddleWare直接继承

Microsoft.Owin.OwinMiddleware

StaticMidlleWare则继承

MiddleWareBase<T> 类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Owin;

/******************************************************************************************************************
 * 
 * 
 * 说 明: 授权(版本:Version1.0.0)
 * 作 者:李朝强
 * 日 期: 2017-03-26 18:40:20
 * 修 改:2017-03-26 18:40:20
 * 参 考:http://my.oschina.net/lichaoqiang/ http://www.lichaoqiang.com
 * 备 注:暂无...
 * 
 * 
 * ***************************************************************************************************************/
namespace MiddleWareApp.MiddleWare
{

    /// <summary>
    /// 中间件基类
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public abstract class MiddleWareBase<T> : Microsoft.Owin.OwinMiddleware
    {

        /// <summary>
        /// 设置选项
        /// </summary>
        public T Options { get; protected set; }

        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="next"></param>
        protected MiddleWareBase(OwinMiddleware next)
            : base(next)
        {

        }

        /// <summary>
        /// 构造函数重载
        /// </summary>
        /// <param name="next"></param>
        /// <param name="options"></param>
        protected MiddleWareBase(OwinMiddleware next, T options)
            : base(next)
        {
            this.Options = options;
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Owin;
using MiddleWareApp.Extensions;

/******************************************************************************************************************
 * 
 * 
 * 说 明: 授权(版本:Version1.0.0)
 * 作 者:李朝强
 * 日 期: 2017-03-26 17:57:30
 * 修 改:2017-03-26 17:57:30
 * 参 考:http://my.oschina.net/lichaoqiang/ http://www.lichaoqiang.com
 * 备 注:暂无...
 * 
 * 
 * ***************************************************************************************************************/
namespace MiddleWareApp.MiddleWare
{

    /// <summary>
    /// CustomMiddleWare
    /// </summary>
    public class CustomMiddleWare : Microsoft.Owin.OwinMiddleware
    {

        /// <summary>
        /// Options
        /// </summary>
        public CustomOptions Options { get; private set; }

        /// <summary>
        /// 构造
        /// </summary>
        /// <param name="next"></param>
        public CustomMiddleWare(OwinMiddleware next)
            : base(next)
        {

        }

        /// <summary>
        /// 构造
        /// </summary>
        /// <param name="middleware"></param>
        /// <param name="options"></param>
        public CustomMiddleWare(OwinMiddleware middleware, CustomOptions options)
            : base(middleware)
        {
            this.Options = options;
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="context"></param>
        /// <returns></returns>
        public override Task Invoke(Microsoft.Owin.IOwinContext context)
        {
            var p = Options;
            context.Response.Write("<p>C<strong>ustomMiddleWare</strong>!This is an middleware!</p>");
            return Next.Invoke(context);//传递下一个中间件
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Owin;
using MiddleWareApp.Extensions;

/******************************************************************************************************************
 * 
 * 
 * 说 明: 授权(版本:Version1.0.0)
 * 作 者:李朝强
 * 日 期: 2017-03-26 18:16:06
 * 修 改:2017-03-26 18:16:06
 * 参 考:http://my.oschina.net/lichaoqiang/ http://www.lichaoqiang.com
 * 备 注:暂无...
 * 
 * 
 * ***************************************************************************************************************/
namespace MiddleWareApp.MiddleWare
{
    /// <summary>
    /// 我们定义的第二个中间件
    /// </summary>
    public class StaticMiddleWare : MiddleWareBase<StaticOptions>
    {
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="next"></param>
        /// <param name="options"></param>
        public StaticMiddleWare(OwinMiddleware next, StaticOptions options)
            : base(next, options)
        {


        }

        /// <summary>
        /// Invoke
        /// </summary>
        /// <param name="context"></param>
        /// <returns></returns>
        public override Task Invoke(IOwinContext context)
        {
            context.Response.Write("<p><strong>StaticMiddleWare</strong>!This is a middleware.</p>");
            return Next.Invoke(context);//交给下一个中间件处理
        }
    }
}

为中间件,定义选项参数,扩展给IAppBuilder类型方法

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Owin;

/******************************************************************************************************************
 * 
 * 
 * 说 明: 授权(版本:Version1.0.0)
 * 作 者:李朝强
 * 日 期: 2017-03-26 18:23:57
 * 修 改:2017-03-26 18:23:57
 * 参 考:http://my.oschina.net/lichaoqiang/ http://www.lichaoqiang.com
 * 备 注:暂无...
 * 
 * 
 * ***************************************************************************************************************/
namespace MiddleWareApp.Extensions
{
    /// <summary>
    /// <![CDATA[自定义扩展类]]>
    /// </summary>
    public static class CustomExtension
    {
        /// <summary>
        /// <![CDATA[使用自定义中间件]]>
        /// </summary>
        /// <param name="app"></param>
        /// <param name="options"></param>
        public static void UseCustomMiddleWare(this IAppBuilder app, CustomOptions options)
        {
            app.Use(typeof(MiddleWare.CustomMiddleWare), options);//注意:Use方法是通过构造函数注入到中间件中的
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using MiddleWareApp.MiddleWare;
using Owin;

/******************************************************************************************************************
 * 
 * 
 * 说 明: 授权(版本:Version1.0.0)
 * 作 者:李朝强
 * 日 期: 2017-03-26 18:46:32
 * 修 改:2017-03-26 18:46:32
 * 参 考:http://my.oschina.net/lichaoqiang/ http://www.lichaoqiang.com
 * 备 注:暂无...
 * 
 * 
 * ***************************************************************************************************************/
namespace MiddleWareApp.Extensions
{
    /// <summary>
    /// StaticExtension
    /// </summary>
    public static class StaticExtension
    {

        /// <summary>
        /// UseStaticMiddleWare
        /// </summary>
        /// <param name="app"></param>
        /// <param name="options"></param>
        public static void UseStaticMiddleWare(this IAppBuilder app, StaticOptions options)
        {
            app.Use<StaticMiddleWare>(options);
        }
    }
}

定义两个option对象:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

/******************************************************************************************************************
 * 
 * 
 * 说 明: 授权(版本:Version1.0.0)
 * 作 者:李朝强
 * 日 期: 2017-03-26 18:25:12
 * 修 改:2017-03-26 18:25:12
 * 参 考:http://my.oschina.net/lichaoqiang/ http://www.lichaoqiang.com
 * 备 注:暂无...
 * 
 * 
 * ***************************************************************************************************************/
namespace MiddleWareApp.Extensions
{

    /// <summary>
    /// 自定义中间件,设置选项
    /// </summary>
    public class CustomOptions
    {
        /// <summary>
        /// 名称
        /// </summary>
        public string Name { get; set; }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

/******************************************************************************************************************
 * 
 * 
 * 说 明: StaticOptions(版本:Version1.0.0)
 * 作 者:李朝强
 * 日 期: 2017-03-26 18:46:06
 * 修 改:2017-03-26 18:46:06
 * 参 考:http://my.oschina.net/lichaoqiang/ http://www.lichaoqiang.com
 * 备 注:暂无...
 * 
 * 
 * ***************************************************************************************************************/
namespace MiddleWareApp.Extensions
{
    /// <summary>
    /// StaticOptions
    /// </summary>
    public class StaticOptions
    {
    }
}

      至此,关于OWIN中间件的常见用法,介绍到此,看完,有没有觉得OWIN中间件So easy!只要明白它的原理,怎么个玩法,看你的了!看代码看的手痒痒的,动手试一试吧。

     更深一步的用法,不在此文中探讨!

© 著作权归作者所有

李朝强
粉丝 91
博文 297
码字总数 149962
作品 0
郑州
产品经理
私信 提问
深入理解 OWIN 中的 Host 和 Server

The Open Web Interface for .NET (OWIN),注意单词为大写,之前好像都写成了 Owin,但用于项目的时候,可以写成:Microsoft.Owin.*。 OWIN 体系结构图(简化版): ASP.NET 5 中 Server 和 ...

林羽恒
2017/06/19
0
0
.Net core 2.x基础学习笔记(2) —— 中间件

这个系列的初衷是便于自己总结与回顾,把笔记本上面的东西转移到这里,态度不由得谨慎许多,下面是我参考的资源: ASP.NET Core 中文文档目录 官方文档 记在这里的东西我会不断的完善丰满,对于文...

半路独行
04/18
0
0
SignalR的另类实现技巧

原文:SignalR的另类实现技巧 很久之前发表过一篇名为《通过三个DEMO学会SignalR的三种实现方式》的文章,在那篇文章里面详细介绍了在WEB应用下的常用SignalR实现方法,而今天我们来利用Signa...

杰克.陈
2017/12/15
0
0
AspNet Katana中Authentication有关的业务逻辑

我将从CookieAuthenticationMiddleware中间件的使用,来讲述cookie认证是如何实现的 1、系统是如何调用CookieAuthenticationMiddleware的 在web.config的appSettings里添加 在CookieAuthent...

经常迷路
09/24
0
0
ASP.NET MVC使用Oauth2.0实现身份验证

 随着软件的不断发展,出现了更多的身份验证使用场景,除了典型的服务器与客户端之间的身份验证外还有,如服务与服务之间的(如微服务架构)、服务器与多种客户端的(如PC、移动、Web等),甚至...

CSharpKit
2017/12/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Mybatis Plus删除

/** @author beth @data 2019-10-17 00:30 */ @RunWith(SpringRunner.class) @SpringBootTest public class DeleteTest { @Autowired private UserInfoMapper userInfoMapper; /** 根据id删除......

一个yuanbeth
今天
4
0
总结

一、设计模式 简单工厂:一个简单而且比较杂的工厂,可以创建任何对象给你 复杂工厂:先创建一种基础类型的工厂接口,然后各自集成实现这个接口,但是每个工厂都是这个基础类的扩展分类,spr...

BobwithB
今天
4
0
java内存模型

前言 Java作为一种面向对象的,跨平台语言,其对象、内存等一直是比较难的知识点。而且很多概念的名称看起来又那么相似,很多人会傻傻分不清楚。比如本文我们要讨论的JVM内存结构、Java内存模...

ls_cherish
今天
4
0
友元函数强制转换

友元函数强制转换 p522

天王盖地虎626
昨天
5
0
js中实现页面跳转(返回前一页、后一页)

本文转载于:专业的前端网站➸js中实现页面跳转(返回前一页、后一页) 一:JS 重载页面,本地刷新,返回上一页 复制代码代码如下: <a href="javascript:history.go(-1)">返回上一页</a> <a h...

前端老手
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部