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
推荐文章:
关注我的微信公众号
在公众号里留言交流
投稿邮箱:1052839972@qq.com
庭院深深深几许?杨柳堆烟,帘幕无重数。
玉勒雕鞍游冶处,楼高不见章台路。
雨横风狂三月暮。门掩黄昏,无计留春住。
泪眼问花花不语,乱红飞过秋千去。
如果感觉对您有帮助
欢迎向作者提供捐赠
这将是创作的最大动力