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


197

举例来说,在一个由带有个人帐户的MVC模板制作的全新ASP.NET MVC 5应用程序中,如果我删除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.NET 4应用程序升级到ASP.NET 5并使用必须在Startup.cs类中配置的组件时,我没有在似乎相关的两个不同类中进行依赖项注入和其他配置。进行启动和配置。


AreaRegistration.RegisterAllAreas();对我造成了错误,因为不允许在启动期间仅在中使用此方法Application_Start。但是,我的应用程序是一个API,此方法显然仅对MVC应用程序有用:stackoverflow.com/questions/18404637/…–
Harvey,

Answers:


171

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,这可能很难理解。

我认为第三个原因是最重要的原因,因为默认情况下我们不采用这种方法,因为某些情况下不包括拥有此DLL,并且能够更改身份验证方法而不会使无关代码的位置无效(例如路线注册)。

但是,如果这些原因都不适合您的情况,那么我认为使用此方法会很好。


19
使用Startup.Configuration()的另一个好处是,你可以很容易地使用owin自主机只有1行代码托管网站:WebApp.Start <启动>(“ 本地主机:3001 /”asp.net/web-api/ overview / hosting-aspnet-web-api /…编写集成测试特别方便
Boris Lipschitz 2014年

16
为了防止“静默停止调用Startup.Configuration”的副作用,您可以添加一个web.config appSettings键“ owin:appStartup”,该键明确指定用于OWIN启动的类型,而不是依赖于名称约定抬头。这对于支持针对不同环境(开发/测试/产品)的不同配置也很方便
Thiago Silva

2
为#3 +1。我想精简地使用Web API,所以我创建了一个空模板ASP.NET网站并添加了WebApi.Owinnuget包。我错误地期望该依赖项包括要在IIS上运行的所有内容。不知道为什么会这样,因为我想让Owin初创公司首先解耦IIS依赖项。
Pluc 2015年

@dmatson在最后一条语句中,您基本上是在暗示Startup类仅用于身份验证吗?
山姆

@Sam,问题显示,启动程序也不用于其他配置,例如过滤器和路由。
dmatson

33

对于那些正在寻找完整步骤的人:如果您要创建基于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模板中,选择“空”作为模板

    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

对于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;
        }
}

现在添加一个继承自的类,ApiControllerRoutePrefixattribute和action方法进行注释Route + HttpGet/PutPost(表示您要使用的Http动词),您应该会很高兴


1
谢谢@dotnetguy!我一直在尝试完全摆脱Global.asax,但无法这样做。终于按照您的步骤,它对我有用。在我的案例中,缺少的部分是对的引用。Install-Package Microsoft.AspNet.WebApi.OwinSelfHost一旦将其添加到api中,就可以删除global.asax。
yyardim '17

2
@yyardim我认为OwinSelfHost与global.asax文件没有多大关系,它只为您提供在Windows服务中在iis之外托管应用程序的选项
Alexander Derck

@dotnetguy Install-Package WebApiContrib.Formatting.Razor 2.3.0.0显示未找到安装软件包错误。必须使用来安装此软件包Install-Package WebApiContrib.Formatting.Razor 2.3.0,因此没有last.0
Dairo

1
@dotnetguy该 [assembly:OwinStartup(typeof(namespace.Startup))]部分必须在名称空间部分之上,否则会产生以下错误Assembly and module attributes must precede all other elements defined in a file except using clauses and extern alias declarations.
Dairo

16

这是我对启动/托管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本身中)无法实现的功能,例如在文件发生事件时重写URL或使用文件中的新部分。Application_StartGlobal.asax<system.webserver>web.config

带OWIN的ASP.NET

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

  • OwinHost包可用于自主机与卡塔纳Web服务器应用程序。
  • Microsoft.Owin.Host.SystemWeb包是用来托管在IIS7 +您的OWIN应用在集成模式下,通过订阅中间件在内部正确的生命周期事件。

使所有事情变得令人困惑的是,Global.asaxOWIN Startup类仍然支持它们,尽管它们都可以做类似的事情。例如,您可以Global.asax使用OWIN中间件来实现CORS 并进行身份验证,这真的很令人困惑。

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

ASP.NET核心

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.