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

时间:2013-11-23 22:58:57

标签: c# asp.net asp.net-mvc asp.net-mvc-5 owin

例如,如果我删除Global.asax.cs类并将其配置代码移至Startup.cs {{},请使用MVC w /个人帐户模板制作的全新ASP.NET MVC 5应用程序。 1}}方法如下,有什么缺点?

Configuration()

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

3 个答案:

答案 0 :(得分:161)

Startup.Configuration的调用时间稍晚于Application_Start,但我不认为这种差异在大多数情况下都不重要。

我认为我们在Global.asax中保留其他代码的主要原因是:

  1. 与以前版本的MVC保持一致。 (这是每个人目前都希望找到此代码的地方。)
  2. 能够添加其他事件处理程序。在Global.asax中,您可以处理其他方法,如Session_Start和Application_Error。
  3. 各种身份验证方案中的正确性。只有在bin目录中有Microsoft.Owin.Host.SystemWeb.dll时,才会调用Startup.Configuration方法。如果你删除这个DLL,它将默默地停止调用Startup.Configuration,这可能很难理解。
  4. 我认为第三个原因是默认情况下我们没有采用这种方法的最重要的原因,因为有些情况不包含此DLL,并且能够更改身份验证方法而不会使无关的位置无效是很好的代码(如路线注册)被放置。

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

答案 1 :(得分:26)

对于那些寻找完整步骤的人:如果您要创建一个基于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作为模板

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

    Microsoft.CodeDom.Providers.DotNetCompilerPlatform v 1.0.0
    Microsoft.Net.Compilers v 1.0.0
    
  4. 安装以下软件包:

    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
    
  5. 对于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动词),你应该很高兴

答案 2 :(得分:6)

这是我对启动/托管Web应用程序的方式的理解,因为它非常令人困惑。一个小总结:

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

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

3。 ASP.NET Core::配置主机和Web服务器以使用和编写您的应用程序代码。如果目标是.NET Core而不是完整的.NET Framework,则不再必须使用.NET Web服务器。


现在,我将详细介绍它的工作方式以及用于启动应用程序的类:

经典ASP.NET

经典ASP.NET应用程序具有Global.asax文件作为入口点。这些应用程序只能在IIS中运行,并且您的代码将在IIS管道的末尾执行(因此IIS甚至在代码运行之前就由IIS负责CORS,身份验证)。从IIS 7开始,您可以在集成模式下运行应用程序,该模式将ASP.NET运行时集成到IIS中。这使您的代码可以配置以前(或仅在IIS本身中)无法实现的功能,例如Application_Start文件的Global.asax事件中的url rewriting或使用新的{{1 }}文件中的<system.webserver>部分。

带有OWIN的ASP.NET

首先OWIN不是库,而是有关.NET Web服务器(例如IIS)与Web应用程序交互方式的规范。 Microsoft本身有一个称为project Katana的OWIN实现(通过几个不同的NuGet软件包分发)。此实现提供了web.config类中遇到的IAppBuilder接口以及Microsoft提供的一些OWIN中间件组件(OMC)。使用Startup,您基本上可以通过即插即用的方式来构成中间件,以为Web服务器创建管道(除了上面提到的IIS7 +中的ASP.NET管道之外),而不必绑定到IIS管道(但现在您将中间件组件用于CORS,将中间件组件用于身份验证...)。因此,您的应用程序不再专门与IIS耦合,您可以在任何.NET Web服务器上运行它,例如:

  • OwinHost软件包可用于通过Katana网络服务器自托管应用程序。
  • Microsoft.Owin.Host.SystemWeb软件包用于通过在内部将中间件预订为正确的生命周期事件,从而以集成模式在IIS7 +中托管OWIN应用程序。

使所有事情变得如此混乱的是,IAppBuilder与OWIN Global.asax类一起仍受支持,尽管它们都可以做类似的事情。例如,您可以在Startup中实现CORS并使用OWIN中间件进行身份验证,这会变得真正令人困惑。

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

ASP.NET Core

ASP.NET Core是下一步的发展,现在您可以定位.NET Core或完整的.NET Framework。以.NET Core为目标时,您可以在支持.NET Standard的任何主机上运行应用程序。这意味着您不再受限于.NET Web服务器(如前所述),而是可以将应用程序托管在Docker容器,Linux Web服务器,IIS ...

ASP.NET Core Web应用程序的入口点是Startup文件。在此配置主机,然后再次在配置管道的地方指定Program.cs类。使用OWIN(通过使用Startup扩展方法)是可选的,但fully supported是可选的。