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

前端之家收集整理的这篇文章主要介绍了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.Net相关文章