asp.net-mvc – MapMvcAttributeRoutes:此方法不能在应用程序的启动前初始化阶段
|
我在一个测试项目中使用ASP MVC V5和属性路由的解决方案中有一个非常简单的测试。属性路由和MapMvcAttributeRoutes方法是ASP MVC 5的一部分。 [Test]
public void HasRoutesInTable()
{
var routes = new RouteCollection();
routes.MapMvcAttributeRoutes();
Assert.That(routes.Count,Is.GreaterThan(0));
}
这导致: System.InvalidOperationException : This method cannot be called during the applications pre-start initialization phase. 此错误消息的大多数答案涉及在web.config文件中配置成员资格提供程序。此项目没有成员资格提供程序或web.config文件,所以错误似乎是由于某些其他原因。如何将代码移出此“启动前”状态,以便测试可以运行? 在调用HttpConfiguration.EnsureInitialized()之后,ApiController上的属性的等效代码可以正常工作。 解决方法我最近将我的项目升级到ASP.NET MVC 5并经历了完全相同的问题。当使用 dotPeek调查它时,我发现有一个内部MapMvcAttributeRoutes扩展方法具有IEnumerable< Type>作为期望控制器类型的列表的参数。我创建了一个新的扩展方法,使用反射,并允许我测试基于属性的路由:public static class RouteCollectionExtensions
{
public static void MapMvcAttributeRoutesForTesting(this RouteCollection routes)
{
var controllers = (from t in typeof(HomeController).Assembly.GetExportedTypes()
where
t != null &&
t.IsPublic &&
t.Name.EndsWith("Controller",StringComparison.OrdinalIgnoreCase) &&
!t.IsAbstract &&
typeof(IController).IsAssignableFrom(t)
select t).ToList();
var mapMvcAttributeRoutesMethod = typeof(RouteCollectionAttributeRoutingExtensions)
.GetMethod(
"MapMvcAttributeRoutes",BindingFlags.NonPublic | BindingFlags.Static,null,new Type[] { typeof(RouteCollection),typeof(IEnumerable<Type>) },null);
mapMvcAttributeRoutesMethod.Invoke(null,new object[] { routes,controllers });
}
}
这里是我如何使用它: public class HomeControllerRouteTests
{
[Fact]
public void RequestTo_Root_ShouldMapTo_HomeIndex()
{
// Arrange
var routes = new RouteCollection();
// Act - registers traditional routes and the new attribute-defined routes
RouteConfig.RegisterRoutes(routes);
routes.MapMvcAttributeRoutesForTesting();
// Assert - uses MvcRouteTester to test specific routes
routes.ShouldMap("~/").To<HomeController>(x => x.Index());
}
}
现在的一个问题是,在RouteConfig.RegisterRoutes(路由),我不能调用routes.MapMvcAttributeRoutes()所以我把这个调用移动到我的Global.asax文件。 另一个问题是这个解决方案是潜在脆弱的,因为RouteCollectionAttributeRoutingExtensions中的上述方法是内部的,可以随时删除。主动方法是检查mapMvcAttributeRoutesMethod变量是否为null,如果是,则提供适当的错误/异常消息。 注意:这只适用于ASP.NET MVC 5.0。 ASP.NET MVC 5.1中的属性路由发生了重大变化,并且mapMvcAttributeRoutesMethod方法已移至内部类。 (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp-classic – 如何在经典ASP中使用VBScript生成MD5?
- 身份验证 – 如何为Asp.NET MVC 5创建ClaimsIdentity对象?
- 收藏的asp.net文件上传类源码
- asp.net – 元素’ToolkitScriptManager’不是已知元素
- asp.net-mvc – 如何在ASP.Net MVC中对自定义ActionFilter进
- asp.net-mvc – ASP.NET MVC4 CustomErrors DefaultRedirec
- 在asp.net中的web.config的位置元素中有多个路径
- asp.net-web-api2 – 创建新的IHttpActionResult动作结果方
- asp.net – 值得学习经典ASP?
- asp.net – 数据注释 – 使用属性扩展并在资源文件中存储正
- asp.net-mvc – MVC4 WebAPI原因短语?
- 我如何在ASP.NET MVC中使用Application_Error?
- asp.net-mvc – ASP.Net MVC:dbml文件的最佳实践
- asp.net-mvc-4 – MVC4 MEF插件和控制器命名空间
- asp.net – 停止在每次构建时创建和删除app_offl
- asp.net – 请求URL在IIS 7中无效
- asp.net-mvc-4 – Web API HTTP请求命名约定
- 实体框架 – 带有实体框架的MVC 3和ASP.Net脚手架
- 如何在ASP.NET 2.0应用程序中为API调用启用TLS 1
- MVC SessionStateAttribute不作为全局属性
