web-dev-qa-db-fra.com

Migrez Global.asax vers Startup.cs

Pour un meilleur travail de test avec Microsoft.Owin.Testing.TestServer, J'ai trouvé que Global.asax n'est pas chargé avec Owin TestServer.

Donc, j'essaie de déplacer mes configurations Global.asax vers Startup.cs comme ci-dessous,

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);
    }
}

Mais TestServeréchec pour initialiser à chaque point de configuration tel que AreaRegistration.RegisterAllAreas, FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters), etc. ...

La migration viable minimum (test réussi avec TestServer) pour moi est comme ci-dessous.

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);
    }
}

Est-il possible de déplacer toutes les configurations vers Startup.cs?

29
Youngjae

Comme vous le savez déjà, OwinContext consommé par Startup.Configuration() est différent du ASP.NET traditionnel HttpContext consommé par MvcApplication.Application_Start(). Les deux utilisent des pipelines de contexte différents. Plus précisément, ASP.NET MVC repose toujours sur System.Web.dll Contrairement à l'API Web ASP.NET.

Par conséquent, en fonction de votre code, certaines méthodes généralement présentées dans MvcApplication.Application_Start() ne peuvent pas être exécutées dans Startup.Configuration():

  • AreaRegistration.RegisterAllAreas();: Cette méthode repose sur System.Web.dll.
  • RouteConfig.RegisterRoutes(RouteTable.Routes);: RouteCollection fait partie de System.Web.dll.
  • GlobalConfiguration.Configure(WebApiConfig.Register): Encore une fois, RouteCollection dans WebApiConfig.Register() fait partie de System.Web.dll.

Pour le routage d'URL dans le contexte OWIN, AttributeRouting est recommandé. Donc, au lieu de cela, essayez config.MapHttpAttributeRoutes(); Cela vous donnera beaucoup de liberté.

Si vous souhaitez toujours exécuter AreaRegistration.RegisterAllAreas(); dans le contexte OWIN, Startup.Configuration(), je vous recommande d'importer bibliothèque Katana . Cela intègre OWIN avec System.Web.dll De sorte que vous archivez probablement votre objectif.

HTH

46
justinyoo