您的位置:首页 > 编程语言 > ASP

Owin管道与asp.net管道模型

2016-01-25 15:43 621 查看
------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

namespace Owin
{
/// <summary>
/// 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 ///
/// </summary>
public enum PipelineStage
{
Authenticate,
PostAuthenticate,
Authorize,
PostAuthorize,
ResolveCache,
PostResolveCache,
MapHandler,
PostMapHandler,
AcquireState,
PostAcquireState,
PreHandlerExecute,
}
}


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

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

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

public void Configuration(IAppBuilder app)
{
app.Use((context, next) =>
{
PrintCurrentIntegratedPipelineStage(context, "Middleware 1");
return next.Invoke();
});
app.Use((context, next) =>
{
PrintCurrentIntegratedPipelineStage(context, "2nd MW");
return next.Invoke();
});
app.UseStageMarker(PipelineStage.Authenticate);
app.Run(context =>
{
PrintCurrentIntegratedPipelineStage(context, "3rd MW");
return context.Response.WriteAsync("Hello world");
});
app.UseStageMarker(PipelineStage.ResolveCache);
}


看代码中红色部分。。。 使用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

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNet.Builder;
using Microsoft.AspNet.Hosting;
using Microsoft.AspNet.Identity.EntityFramework;
using Microsoft.Data.Entity;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using WebApplication2.Models;
using WebApplication2.Services;

namespace WebApplication2
{
public class Startup
{
public Startup(IHostingEnvironment env)
{
// Set up configuration sources.
var builder = new ConfigurationBuilder()
.AddJsonFile("appsettings.json")
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true);

if (env.IsDevelopment())
{
// For more details on using the user secret store see http://go.microsoft.com/fwlink/?LinkID=532709 builder.AddUserSecrets();
}

builder.AddEnvironmentVariables();
Configuration = builder.Build();
}

public IConfigurationRoot Configuration { get; set; }

// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
// Add framework services.
services.AddEntityFramework()
.AddSqlServer()
.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(Configuration["Data:DefaultConnection:ConnectionString"]));

services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();

services.AddMvc();

// Add application services.
services.AddTransient<IEmailSender, AuthMessageSender>();
services.AddTransient<ISmsSender, AuthMessageSender>();
}

// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
loggerFactory.AddConsole(Configuration.GetSection("Logging"));
loggerFactory.AddDebug();

if (env.IsDevelopment())
{
app.UseBrowserLink();
app.UseDeveloperExceptionPage();
app.UseDatabaseErrorPage();
}
else
{
app.UseExceptionHandler("/Home/Error");

// For more details on creating database during deployment see http://go.microsoft.com/fwlink/?LinkID=615859 try
{
using (var serviceScope = app.ApplicationServices.GetRequiredService<IServiceScopeFactory>()
.CreateScope())
{
serviceScope.ServiceProvider.GetService<ApplicationDbContext>()
.Database.Migrate();
}
}
catch { }
}

app.UseIISPlatformHandler(options => options.AuthenticationDescriptions.Clear());

app.UseStaticFiles();

app.UseIdentity();

// To configure external authentication please see http://go.microsoft.com/fwlink/?LinkID=532715 
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}

// Entry point for the application.
public static void Main(string[] args) => WebApplication.Run<Startup>(args);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: