MVC5 WebApi2 使用OWIN管道管理中间件

2020-09-20  乐帮网

owin mvc webapi

前言:
OWIN规范诞生之初就是使用管道,生命周期等概念解耦程序。使用IIS托管网站本身已经有自己的生命周期本应可以不使用OWIN等组件。但是如果是要是脱离了IIS程序就很难做到兼容性。在IIS部署的站点中使用OWIN组件并不冲突。详细的使用程序参看官方文档,下面只列出了简单的教程。

1、建立一个MVC5 / WebApi项目。我使用的是VS2019 自动模块就可以,如下图:

2、引入依赖包;注意引入 Microsoft.Owin.Host.SystemWeb 时会自动引入依赖项 Microsoft.Owin。

Install-Package Microsoft.Owin
Install-Package Microsoft.Owin.Host.SystemWeb
Install-Package Microsoft.AspNet.WebApi.Owin

3、建立Startup 类,如果你之前对NetCore熟悉那理解这个就十分简单了,概括来说就是取代Global.asax 文件,在程序启动,或者开始活动时触发执行。建立这个类后那Global.asax 文件还会执行吗?IIS中之前有的生命周期还在吗?以我现在的理解是对IIS的生命周期没有影响,还会正常执行,因为这个的实现是建立在IIS托管的生命周期之上的。所以在Global类的处理需要注释掉,实现逻辑移动到Startup里。Startup类内容如下:

using System;
using System.Threading.Tasks;
using System.Web.Http;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;
using Microsoft.Owin;
using Owin;
using Owin.Web.Middleware;
using Microsoft.Owin.Extensions;

[assembly: OwinStartup(typeof(Owin.Web.Startup))]
namespace Owin.Web
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=316888

            AreaRegistration.RegisterAllAreas();
            //GlobalConfiguration.Configure(WebApiConfig.Register);
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);

            app.Use<LoggingMiddleware>(new LogConfig()
            {
                Name = "log middleware"
            });
            app.Use((context, next) =>
            {
                Console.WriteLine("Middleware 2");
                return next.Invoke();
            });

            var apiConfig = new HttpConfiguration();
            apiConfig.Routes.MapHttpRoute(
                "DefaultApi",
                "api/{controller}/{id}",
                new { id = RouteParameter.Optional });
           
            apiConfig.MapHttpAttributeRoutes();
            app.UseWebApi(apiConfig);
            
        }
    }
}


4、编写中间件(middleware)
可以通过简单的匿名表达式来写处理逻辑,完成中间件的功能,Microsoft.Owin.dll也提供了一个基础抽象类,可轻松创建Owin中间件,再扩展一下,也可以传自定义参数,两种方式上面代码都有体现,以中间件 LoggingMiddleware为例:

public class LoggingMiddleware: OwinMiddleware
    {

        private OwinMiddleware _next;

        private LogConfig _config;

        public LoggingMiddleware(OwinMiddleware next, LogConfig config) :base(next)
        {
            _config = config;
            _next = next;
        }

        public override Task Invoke(IOwinContext context)
        {
            Console.WriteLine($"LoggingMiddleware Invoke:{_config.Name}");
            return _next.Invoke(context);
        }
  public class LogConfig
    {
        public string Name { get; set; }
    }

代码完成,访问网页或者调用api时中间件会生效。这个一般是我们做认证、控制反转、角色注入等扩展功能的基础。

@注意,在这里我们讨论的是发布到IIS下的实现,同时兼容MVC和Webapi2 。以上列出的是全部的代码,

如果还想下载已完成的源码,请先点击捐赠。

链接:https://pan.baidu.com/s/1Cvqr4aq4pURGm8ETQ6_iBw 

推荐文章:

MVC5 WebApi2 使用OWIN管道管理中间件

Owin中间件获取Response body stream

WebApi2 Owin Autofac Demo

 

公众号二维码

关注我的微信公众号
在公众号里留言交流
投稿邮箱:1052839972@qq.com

庭院深深深几许?杨柳堆烟,帘幕无重数。
玉勒雕鞍游冶处,楼高不见章台路。
雨横风狂三月暮。门掩黄昏,无计留春住。
泪眼问花花不语,乱红飞过秋千去。

欧阳修

付款二维码

如果感觉对您有帮助
欢迎向作者提供捐赠
这将是创作的最大动力