В моем приложении ASP.Net MVC 2 определен последний маршрут, который будет сопоставлять старые URL-адреса, которые больше не используются, с соответствующими новыми URL-адресами, на которые следует перенаправить.Этот маршрут возвращает действие и контроллер, который отвечает за фактическое выполнение перенаправления, а также возвращает URL-адрес действия контроллера, который является URL-адресом для перенаправления.Поскольку маршрут отвечает за создание нового URL-адреса для перенаправления, он вызывает маршрутизатор для получения соответствующих URL-адресов.Это прекрасно работало с .Net 3.5, но когда я обновился до .Net 4, метод GetVirtualPath выдает исключение System.Threading.LockRecursionException: «Рекурсивное получение блокировки чтения не разрешено в этом режиме».Следующий код решает проблему, но довольно уродливо:
public static string GetActionUrl(HttpContextBase context, string routeName, object routeValues)
{
RequestContext requestContext = new RequestContext(context, new RouteData());
VirtualPathData vp = null;
try
{
vp = _Routes.GetVirtualPath(requestContext, routeName, new RouteValueDictionary(routeValues));
}
catch (System.Threading.LockRecursionException)
{
var tmpRoutes = new RouteCollection();
Router.RegisterRoutes(tmpRoutes);
vp = tmpRoutes.GetVirtualPath(requestContext, routeName, new RouteValueDictionary(routeValues));
}
if (vp == null)
throw new Exception(String.Format("Could not find named route {0}", routeName));
return vp.VirtualPath;
}
Кто-нибудь знает, какие изменения в .Net 4 могли вызвать эту ошибку?Кроме того, является ли вызов маршрута из метода GetRouteData другого маршрута просто плохой практикой и что-то, что я вообще не должен делать?