gpt4 book ai didi

asp.net-mvc - MapMvcAttributeRoutes:在应用程序的启动前初始化阶段不能调用此方法

转载 作者:行者123 更新时间:2023-12-03 08:04:25 25 4
gpt4 key购买 nike

我在使用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文件,因此似乎由于其他原因而发生了错误。如何将代码移出此“预启动”状态,以便测试可以运行?

调用 ApiController后,等效于 HttpConfiguration.EnsureInitialized()的属性的代码可以正常工作。

最佳答案

我最近将项目升级到ASP.NET MVC 5,并遇到了完全相同的问题。当使用dotPeek进行调查时,我发现有一个内部MapMvcAttributeRoutes扩展方法,该方法以IEnumerable<Type>作为参数,期望使用 Controller 类型列表。我创建了一个使用反射的新扩展方法,并允许我测试基于属性的路由:

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(route)内部,我无法调用 routes.MapMvcAttributeRoutes(),因此我将该调用移到了Global.asax文件中。

另一个问题是该解决方案可能很脆弱,因为 RouteCollectionAttributeRoutingExtensions中的上述方法是内部方法,可以随时删除。主动的方法是检查 mapMvcAttributeRoutesMethod变量是否为null,如果存在,则提供适当的错误/异常消息。

注意:仅适用于ASP.NET MVC 5.0。 ASP.NET MVC 5.1中的属性路由进行了重大更改,并且 mapMvcAttributeRoutesMethod方法已移至内部类。

关于asp.net-mvc - MapMvcAttributeRoutes:在应用程序的启动前初始化阶段不能调用此方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20034983/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com