将Global.asax迁移到Startup.cs

时间:2014-07-30 08:40:11

标签: c# asp.net asp.net-mvc-4 unit-testing 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);
    }
}

但是TestServer 无法在每个配置点初始化,例如AreaRegistration.RegisterAllAreasFilterConfig.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);
    }
}

是否有将所有配置移至Startup.cs?

1 个答案:

答案 0 :(得分:46)

如您所知,OwinContext消耗的Startup.Configuration()HttpContext消耗的传统ASP.NET MvcApplication.Application_Start()不同。两者都使用不同的上下文管道。更具体地说,ASP.NET MVC仍然依赖于System.Web.dll而ASP.NET Web API没有。

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

  • AreaRegistration.RegisterAllAreas();:此方法依赖于System.Web.dll
  • RouteConfig.RegisterRoutes(RouteTable.Routes);RouteCollectionSystem.Web.dll
  • 的一部分
  • GlobalConfiguration.Configure(WebApiConfig.Register):同样,RouteCollection中的WebApiConfig.Register()System.Web.dll的一部分。

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

如果您仍希望在OWIN上下文AreaRegistration.RegisterAllAreas();中运行Startup.Configuration(),我建议您最好导入Katana library。这将OWIN与System.Web.dll集成在一起,这样您就可以实现目标。

HTH