为了更好地使用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?
答案 0 :(得分:46)
如您所知,OwinContext
消耗的Startup.Configuration()
与HttpContext
消耗的传统ASP.NET 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
的一部分。对于OWIN上下文中的URL路由,建议使用AttributeRouting
。所以,不要这样,试试config.MapHttpAttributeRoutes();
这会给你很大的自由。
如果您仍希望在OWIN上下文AreaRegistration.RegisterAllAreas();
中运行Startup.Configuration()
,我建议您最好导入Katana library。这将OWIN与System.Web.dll
集成在一起,这样您就可以实现目标。
HTH