简体   繁体   English

将Global.asax迁移到Startup.cs

[英]Migrate Global.asax to Startup.cs

For better test job with Microsoft.Owin.Testing.TestServer , I found that Global.asax is not loaded with Owin TestServer. 为了更好地使用Microsoft.Owin.Testing.TestServer测试,我发现Global.asax没有加载Owin TestServer。

So, I try to move my Global.asax configurations to Startup.cs as below, 所以,我尝试将我的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);
    }
}

But TestServer failed to initialize in every point of configuration such as AreaRegistration.RegisterAllAreas , FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters) , so on... 但是TestServer 无法在每个配置点初始化,例如AreaRegistration.RegisterAllAreasFilterConfig.RegisterGlobalFilters(GlobalFilters.Filters) ,等等......

Minimum viable migration(successful test with TestServer) for me is as below. 对我来说,最小可行迁移(使用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);
    }
}

Is there anyway to move all configurations to Startup.cs? 反正有没有将所有配置移动到Startup.cs?

As you are already aware, OwinContext consumed by Startup.Configuration() is different from the traditional ASP.NET HttpContext consumed by MvcApplication.Application_Start() . 正如你已经知道, OwinContext所消耗的Startup.Configuration()是从传统的ASP.NET不同HttpContext所消耗的MvcApplication.Application_Start() Both are using different context pipelines. 两者都使用不同的上下文管道。 More specifically, ASP.NET MVC still relies on System.Web.dll while ASP.NET Web API doesn't. 更具体地说,ASP.NET MVC仍然依赖于System.Web.dll而ASP.NET Web API则不依赖。

Therefore, based on your code, some methods usually laid in MvcApplication.Application_Start() can't be run within Startup.Configuration() : 因此,根据您的代码,通常在MvcApplication.Application_Start()放置的一些方法无法在Startup.Configuration()运行:

  • AreaRegistration.RegisterAllAreas(); : This method relies on System.Web.dll . :此方法依赖于System.Web.dll
  • RouteConfig.RegisterRoutes(RouteTable.Routes); : RouteCollection is a part of System.Web.dll . RouteCollectionSystem.Web.dll的一部分。
  • GlobalConfiguration.Configure(WebApiConfig.Register) : Again, RouteCollection within WebApiConfig.Register() is a part of System.Web.dll . GlobalConfiguration.Configure(WebApiConfig.Register)同样, RouteCollectionWebApiConfig.Register()是其中一部分System.Web.dll

For URL routing within OWIN context, AttributeRouting is recommended. 对于OWIN上下文中的URL路由,建议使用AttributeRouting So, instead of this, try config.MapHttpAttributeRoutes(); 所以,不要这样,尝试config.MapHttpAttributeRoutes(); That will give you much freedom. 这会给你很大的自由。

If you still want to run AreaRegistration.RegisterAllAreas(); 如果你还想运行AreaRegistration.RegisterAllAreas(); within OWIN context, Startup.Configuration() , I'd better recommend to import Katana library . 在OWIN上下文中, Startup.Configuration() ,我最好建议导入Katana库 This integrates OWIN with System.Web.dll so that you probably archieve your goal. 这将OWIN与System.Web.dll集成在一起,这样您就可以实现目标。

HTH HTH

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM