Owin管道与asp.net管道模型
------2016.3.6 更新 文中提到没有Microsoft.Owin.Host.SystemWeb 这个dll 便不会加载Startup.Configuration,因为这个dll 其中有个OwinHttpModul. 网站回加载这个modul然后在这里面实现了owin的管道(ps 就是 把owin定义的模块挂载到httpapplication的 几个事件上)。
最近一直没搞懂在 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 }