将Global.asax迁移到Startup.cs

You*_*jae 29 c# asp.net unit-testing asp.net-mvc-4 asp.net-web-api2

为了更好地测试工作Microsoft.Owin.Testing.TestServer,我发现Global.asax没有加载Owin TestServer.

所以,我尝试将我的Global.asax配置移动到Startup.cs,如下所示,

public partial class Startup
{
    public void Configuration(IAppBuilder app)
    {
        // pasted Global.asax things start.
        GlobalConfiguration.Configuration.Formatters.Clear();

        var jsonSerializerSettings = new JsonSerializerSettings
        {
            PreserveReferencesHandling = PreserveReferencesHandling.Objects,
            ReferenceLoopHandling = ReferenceLoopHandling.Ignore,
        };
        GlobalConfiguration.Configuration.Formatters.Add(new JsonMediaTypeFormatter() { SerializerSettings = jsonSerializerSettings });
        GlobalConfiguration.Configuration.Formatters.Add(new FormMultipartEncodedMediaTypeFormatter());

        AreaRegistration.RegisterAllAreas();
        GlobalConfiguration.Configure(WebApiConfig.Register);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
        // pasted Global.asax things end.

        ConfigureAuth(app);
    }
}
Run Code Online (Sandbox Code Playgroud)

TestServer 到配置的每一点初始化,如AreaRegistration.RegisterAllAreas,FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters),等...

对我来说,最小可行迁移(使用TestServer成功测试)如下所示.

public partial class Startup
{
    public void Configuration(IAppBuilder app)
    {
        var config = new HttpConfiguration();
        config.Formatters.Clear();

        var jsonSerializerSettings = new JsonSerializerSettings
        {
            PreserveReferencesHandling = PreserveReferencesHandling.Objects,
            ReferenceLoopHandling = ReferenceLoopHandling.Ignore,
        };
        config.Formatters.Add(new JsonMediaTypeFormatter() { SerializerSettings = jsonSerializerSettings });
        config.Formatters.Add(new FormMultipartEncodedMediaTypeFormatter());

        WebApiConfig.Register(config); // moved from GlobalConfiguration.Configure(WebApiConfig.Register)
        app.UseWebApi(config);
        ConfigureAuth(app);
    }
}
Run Code Online (Sandbox Code Playgroud)

反正有没有将所有配置移动到Startup.cs?

jus*_*yoo 46

正如你已经知道,OwinContext消耗的Startup.Configuration()是从传统的ASP.NET不同HttpContext的消耗MvcApplication.Application_Start().两者都使用不同的上下文管道.更具体地说,ASP.NET MVC仍然依赖于System.Web.dllASP.NET Web API.

因此,根据您的代码,通常存在的一些方法MvcApplication.Application_Start()无法在以下内容中运行Startup.Configuration():

  • AreaRegistration.RegisterAllAreas();:这种方法依赖于System.Web.dll.
  • RouteConfig.RegisterRoutes(RouteTable.Routes);:RouteCollection是的一部分System.Web.dll.
  • GlobalConfiguration.Configure(WebApiConfig.Register):同样,RouteCollection内在WebApiConfig.Register()是一部分System.Web.dll.

对于OWIN上下文中的URL路由,AttributeRouting建议使用.所以,不要这样,尝试config.MapHttpAttributeRoutes();那会给你很大的自由.

如果您仍想AreaRegistration.RegisterAllAreas();在OWIN环境中运行Startup.Configuration(),我最好建议导入Katana库.这将OWIN集成在一起,System.Web.dll以便您可以实现目标.

HTH

  • @Gurpreet确实.如果您至少安装[Microsoft.Owin.Host.SystemWeb(https://www.nuget.org/packages/Microsoft.Owin.Host.SystemWeb/)和`Application_Start`在`Global.asax中移动的点点滴滴.cs`到`Startup.cs`,应该没问题. (3认同)