Owin管道与asp.net管道模型

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Owin管道与asp.net管道模型相关的知识,希望对你有一定的参考价值。

最近一直没搞懂在 mvc5框架中 为什么存在 Global.asax.cs和Startup.cs 文件... 

然后搜索下面文章:

http://stackoverflow.com/questions/20168978/do-i-need-a-global-asax-cs-file-at-all-if-im-using-an-owin-startup-cs-class-and

其中提到 

1、Application_Start 会比Startup.Configuration 先启动 

2、mvc4 版本一致性 布啦布啦....

3、 Global.asax.cs 可以处理一些特殊事件 例如 Application_Start Application_Error Session_Start 等等

4、Startup.Configuration 中可以配置 关于授权之类的(替代原先的Application_AuthenticateRequest,另外mvc5中引入了ASP.NET Identity 2,而这个基于Owin)

5、最最重要的一条如果 引用集没有Microsoft.Owin.Host.SystemWeb 这个dll 便不会加载Startup.Configuration

----------------------分割线----------------------------------

ok 进入另一个话题 owin 的管道有什么 首先贴下微软的PipelineStage

 1 namespace Owin
 2 {
 3   /// <summary>
 4   /// An ordered list of known Asp.Net integrated pipeline stages. More details on the ASP.NET integrated pipeline can be found at http://msdn.microsoft.com/en-us/library/system.web.httpapplication.aspx
 5   /// 
 6   /// </summary>
 7   public enum PipelineStage
 8   {
 9     Authenticate,
10     PostAuthenticate,
11     Authorize,
12     PostAuthorize,
13     ResolveCache,
14     PostResolveCache,
15     MapHandler,
16     PostMapHandler,
17     AcquireState,
18     PostAcquireState,
19     PreHandlerExecute,
20   }
21 }

看注释 去看 httpapplication事件。。。个人感觉Owin管道里的事件是可以替代原先的httpapplication事件的。。。

--------------------------------------------分割线-----------------------------------------------------

既然说到Startup.Configuration可以替代 那怎么用才是关键,直接上代码:

 1 public void Configuration(IAppBuilder app)
 2 {
 3     app.Use((context, next) =>
 4     {
 5         PrintCurrentIntegratedPipelineStage(context, "Middleware 1");
 6         return next.Invoke();
 7     });
 8     app.Use((context, next) =>
 9     {
10         PrintCurrentIntegratedPipelineStage(context, "2nd MW");
11         return next.Invoke();
12     });
13     app.UseStageMarker(PipelineStage.Authenticate);
14     app.Run(context =>
15     {
16         PrintCurrentIntegratedPipelineStage(context, "3rd MW");
17         return context.Response.WriteAsync("Hello world");
18     });
19     app.UseStageMarker(PipelineStage.ResolveCache);
20 }

看代码中红色部分。。。 使用app.UseStageMarker(xxxx状态)之前的代码 便是xxxx状态注册。

注意:

  1、如果不是用UseStageMarker标记 那些中间件的位置 所有的位置为:PreHandlerExecute。

  2、多次使用UseStageMarker 不能 前面顺序比后面大。。。

      相关链接:http://www.asp.net/aspnet/overview/owin-and-katana/owin-middleware-in-the-iis-integrated-pipeline

----------------------------分割线-----------------------------------------------------------

个人一些闲言碎语

貌似 asp.net5 里 mvc框架 中没有了Global.asax.cs文件 入口就是Startup.cs 

还有 个人感觉  IOwinConent 会替代 HttpAplication ;OwinMiddleware 替代IHttpModule ( 当然这是指 asp.net5里,而mvc5中还是 混搭风格),app.Use(xxxxxx)构成的 管道还是 相对好理解的 

不过现在asp.net 还是 rc等出了 rtm再来更新吧。。。。

 贴下 asp.net5中Startup

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 using System.Threading.Tasks;
  5 using Microsoft.AspNet.Builder;
  6 using Microsoft.AspNet.Hosting;
  7 using Microsoft.AspNet.Identity.EntityFramework;
  8 using Microsoft.Data.Entity;
  9 using Microsoft.Extensions.Configuration;
 10 using Microsoft.Extensions.DependencyInjection;
 11 using Microsoft.Extensions.Logging;
 12 using WebApplication2.Models;
 13 using WebApplication2.Services;
 14 
 15 namespace WebApplication2
 16 {
 17     public class Startup
 18     {
 19         public Startup(IHostingEnvironment env)
 20         {
 21             // Set up configuration sources.
 22             var builder = new ConfigurationBuilder()
 23                 .AddJsonFile("appsettings.json")
 24                 .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true);
 25 
 26             if (env.IsDevelopment())
 27             {
 28                 // For more details on using the user secret store see http://go.microsoft.com/fwlink/?LinkID=532709
 29                 builder.AddUserSecrets();
 30             }
 31 
 32             builder.AddEnvironmentVariables();
 33             Configuration = builder.Build();
 34         }
 35 
 36         public IConfigurationRoot Configuration { get; set; }
 37 
 38         // This method gets called by the runtime. Use this method to add services to the container.
 39         public void ConfigureServices(IServiceCollection services)
 40         {
 41             // Add framework services.
 42             services.AddEntityFramework()
 43                 .AddSqlServer()
 44                 .AddDbContext<ApplicationDbContext>(options =>
 45                     options.UseSqlServer(Configuration["Data:DefaultConnection:ConnectionString"]));
 46 
 47             services.AddIdentity<ApplicationUser, IdentityRole>()
 48                 .AddEntityFrameworkStores<ApplicationDbContext>()
 49                 .AddDefaultTokenProviders();
 50 
 51             services.AddMvc();
 52 
 53             // Add application services.
 54             services.AddTransient<IEmailSender, AuthMessageSender>();
 55             services.AddTransient<ISmsSender, AuthMessageSender>();
 56         }
 57 
 58         // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
 59         public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
 60         {
 61             loggerFactory.AddConsole(Configuration.GetSection("Logging"));
 62             loggerFactory.AddDebug();
 63 
 64             if (env.IsDevelopment())
 65             {
 66                 app.UseBrowserLink();
 67                 app.UseDeveloperExceptionPage();
 68                 app.UseDatabaseErrorPage();
 69             }
 70             else
 71             {
 72                 app.UseExceptionHandler("/Home/Error");
 73 
 74                 // For more details on creating database during deployment see http://go.microsoft.com/fwlink/?LinkID=615859
 75                 try
 76                 {
 77                     using (var serviceScope = app.ApplicationServices.GetRequiredService<IServiceScopeFactory>()
 78                         .CreateScope())
 79                     {
 80                         serviceScope.ServiceProvider.GetService<ApplicationDbContext>()
 81                              .Database.Migrate();
 82                     }
 83                 }
 84                 catch { }
 85             }
 86 
 87             app.UseIISPlatformHandler(options => options.AuthenticationDescriptions.Clear());
 88 
 89             app.UseStaticFiles();
 90 
 91             app.UseIdentity();
 92 
 93             // To configure external authentication please see http://go.microsoft.com/fwlink/?LinkID=532715
 94 
 95             app.UseMvc(routes =>
 96             {
 97                 routes.MapRoute(
 98                     name: "default",
 99                     template: "{controller=Home}/{action=Index}/{id?}");
100             });
101         }
102 
103         // Entry point for the application.
104         public static void Main(string[] args) => WebApplication.Run<Startup>(args);
105     }
106 }

 

以上是关于Owin管道与asp.net管道模型的主要内容,如果未能解决你的问题,请参考以下文章

Asp.net管道模型之(HttpModules 和 HttpHandler)

2021-07-03 .NET高级班 86- ASP.NET MVC 管道模型详解

Asp.net管道模型(管线模型)

Asp.Net管道模型和Asp.Net Core的Middleware模型的对比

谈谈IIS与ASP.NET管道

NET CORE 管道模型及中间件使用解读