قم بترحيل Global.asax إلى Startup.cs
-
21-12-2019 - |
سؤال
للحصول على وظيفة اختبار أفضل مع 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
بحيث ربما تحقق هدفك.
هث