سؤال

للحصول على وظيفة اختبار أفضل مع 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.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؟

هل كانت مفيدة؟

المحلول

كما تعلمون بالفعل، OwinContext يستهلكها Startup.Configuration() يختلف عن ASP.NET التقليدي HttpContext يستهلكها 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);: RouteCollection هو جزء من System.Web.dll.
  • GlobalConfiguration.Configure(WebApiConfig.Register):مرة أخرى، RouteCollection داخل WebApiConfig.Register() هو جزء من System.Web.dll.

لتوجيه عنوان URL ضمن سياق OWIN، AttributeRouting موصى به.لذا، بدلًا من هذا، حاول config.MapHttpAttributeRoutes(); سيعطيك ذلك الكثير من الحرية.

إذا كنت لا تزال ترغب في الركض AreaRegistration.RegisterAllAreas(); ضمن سياق OWIN، Startup.Configuration(), ، من الأفضل أن أوصي بالاستيراد مكتبة كاتانا.هذا يدمج OWIN مع System.Web.dll بحيث ربما تحقق هدفك.

هث

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top