如果我使用OWIN Startup.cs类并将所有配置移动到那里,我是否需要一个Global.asax.cs文件?

让我们以一个全新的ASP为例。NET MVC 5应用程序从MVC与个人帐户模板,如果我删除Global.asax.cs类和移动它的配置代码到Startup.cs Configuration()方法如下,有什么缺点?

public partial class Startup
{
public void Configuration(IAppBuilder app)
{
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);


ConfigureAuth(app);
}
}

对我来说,好处是在升级ASP时。asp.net 4应用到ASP。NET 5和使用现在必须在Startup.cs类中配置的部分,我没有在两个不同的类中进行依赖注入和其他配置,这两个类似乎与启动和配置有关。

76630 次浏览

启动。Configuration被调用的时间比Application_Start稍微晚一些,但我认为在大多数情况下,这种差异不会有太大影响。

我相信我们把其他代码保留在全局的主要原因。asax是:

  1. 与以前版本的MVC保持一致。(这是目前每个人都希望找到这段代码的地方。)
  2. 能够添加其他事件处理程序。在全球。asax,你可以处理其他方法,如Session_Start和Application_Error。
  3. 各种身份验证场景中的正确性。启动。只有在bin目录中有microsoft . owen . host . systemweb .dll时才会调用配置方法。如果删除此DLL,它将以静默方式停止调用Startup。配置,这可能很难理解。

我认为第三个原因是最重要的一个原因,我们没有默认采用这种方法,因为一些场景不包括有这个DLL,而且能够更改身份验证方法而不使放置不相关代码(如路由注册)的位置无效是很好的。

但是如果这些原因都不适用于您的场景,我认为您可以使用这种方法。

对于那些正在寻找完整步骤的人:如果你正在寻找一个基于OWIN的,IIS托管的web API,这些步骤应该会让你到达那里:

  1. File -> New -> Project
  2. 在对话中,Installed -> templates -> Other Project types -> Visual Studio Solutions -> Blank Solution targeting .NET 4.6
  3. 在解决方案上,右键单击,添加Project -> Web -> ASP.NET Web Application(针对.NET 4.6)

    3.1现在在ASP。NET 4.5模板,选择Empty作为模板

    这将创建一个包含两个nuget包的空白解决方案:

    Microsoft.CodeDom.Providers.DotNetCompilerPlatform v 1.0.0
    Microsoft.Net.Compilers v 1.0.0
    
  4. Install the following packages:

    Install-Package Microsoft.AspNet.WebApi.WebHost -Version 5.2.3
    Install-Package Microsoft.AspNet.WebApi -Version 5.2.3
    Install-Package WebApiContrib.Formatting.Razor 2.3.0.0
    

For OWIN:

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

然后用Configuration方法添加Startup.cs:

[assembly:OwinStartup(typeof(namespace.Startup))]
public class Startup
{
/// <summary> Configurations the specified application. </summary>
/// <param name="app">The application.</param>
public static void Configuration(IAppBuilder app)
{
var httpConfiguration = CreateHttpConfiguration();


app
.UseWebApi(httpConfiguration);
}


/// <summary> Creates the HTTP configuration. </summary>
/// <returns> An <see cref="HttpConfiguration"/> to bootstrap the hosted API </returns>
public static HttpConfiguration CreateHttpConfiguration()
{
var httpConfiguration = new HttpConfiguration();
httpConfiguration.MapHttpAttributeRoutes();


return httpConfiguration;
}
}

现在添加一个继承自ApiController的类,用RoutePrefix属性注释它,用Route + HttpGet/PutPost(表示你要的Http动词)注释动作方法,你应该可以开始了

这是我对启动/托管web应用程序的理解,因为这一切都很令人困惑。一个小总结:

1. 典型的ASP。NET:只编写在强制IIS管道的最后一步运行的应用程序代码

2. ASP。NET与OWIN:配置一个。net web服务器并编写应用程序代码。不再直接耦合到IIS,因此您不再被迫使用它。

3.ASP。NET核心:配置主机和web服务器来使用和编写应用程序代码。如果你的目标是。net Core,而不是完整的。net框架,那么不再强制使用。net web服务器。


现在我将更详细地介绍它是如何工作的,以及使用哪些类来启动应用程序:

典型的ASP。网

典型的ASP。. NET应用程序将Global.asax文件作为入口点。这些应用程序只能在IIS中运行,并且您的代码在IIS管道的末尾执行(因此IIS负责CORS,身份验证……)甚至在代码运行之前)。从iis7开始,你可以在集成模式下运行你的应用程序。NET运行时到IIS。这使得你的代码可以配置以前(或仅在IIS本身)不可能实现的功能,例如你的Global.asax文件的Application_Start事件中的url重写,或者在你的web.config文件中使用新的<system.webserver>部分。

ASP。NET with OWIN

首先,OWIN不是一个库,而是关于. net web服务器(例如IIS)如何与web应用程序交互的规范。微软自己有一个名为项目的武士刀的OWIN实现(通过几个不同的NuGet包分发)。这个实现提供了你在Startup类中遇到的IAppBuilder接口和微软提供的一些OWIN中间件(OMC)。使用IAppBuilder你基本上以即插即用的方式组合中间件来为web服务器创建管道(除了ASP。NET管道在IIS7+如上所述),而不是被绑定到IIS管道(但现在你使用一个中间件的CORS,一个中间件的身份验证…)正因为如此,你的应用程序不再与IIS耦合,你可以在任何。net web服务器上运行它,例如:

  • OwinHost包可以用一个Katana web服务器自托管你的应用程序。
  • Microsoft.Owin.Host.SystemWeb包用于以集成模式在IIS7+中托管您的OWIN应用程序,方法是在内部将您的中间件订阅到正确的生命周期事件。

令人困惑的是,Global.asax仍然与OWIN Startup类一起被支持,而它们都可以做类似的事情。例如,你可以在Global.asax中实现CORS,并使用OWIN中间件进行身份验证,这使真的变得令人困惑。

我的经验法则是在需要添加OWIN时,一起删除Global.asax文件,以便使用Startup

ASP。网络核心

ASP。NET Core是下一个进化,现在你可以瞄准。NET Core或者完整的。NET框架。当你瞄准。net Core时,你可以在任何支持。net标准的主机上运行你的应用程序。这意味着你不再局限于一个。net web服务器(如前一点),而是可以在Docker容器中托管你的应用程序,linux web服务器,IIS…

ASP的入口点。NET Core web应用程序是Program.cs文件。在那里你配置你的主机,并再次指定你的Startup类,在那里你配置你的管道。使用OWIN(通过使用IAppBuilder.UseOwin扩展方法)是可选的,但是完全支持. xml是可选的。