web-dev-qa-db-ja.com

Global.asaxをStartup.csに移行する

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

ただし、TestServerfailedは、_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);
    }
}
_

とにかくすべての構成をStartup.csに移動する方法はありますか?

29
Youngjae

既にお気づきのとおり、Startup.Configuration()によって消費されるOwinContextは、MvcApplication.Application_Start()によって消費される従来のASP.NET HttpContextとは異なります。両方とも異なるコンテキストパイプラインを使用しています。より具体的には、ASP.NET MVCは依然として_System.Web.dll_に依存していますが、ASP.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):繰り返しますが、WebApiConfig.Register()内のRouteCollectionは_System.Web.dll_の一部です。

OWINコンテキスト内のURLルーティングには、AttributeRoutingが推奨されます。したがって、これの代わりに、config.MapHttpAttributeRoutes();を試してください。これにより、多くの自由が得られます。

それでもAreaRegistration.RegisterAllAreas();をOWINコンテキストStartup.Configuration()内で実行したい場合は、 Katanaライブラリ をインポートすることをお勧めします。これにより、OWINと_System.Web.dll_が統合されるため、おそらく目標を達成できます。

HTH

46
justinyoo