0

我将 Elmah.MVC 添加到我的 MVC 站点,但是当访问 /elmah 时,我的站点陷入重定向循环 /elmah?culture=en - 我认为这是因为我的一个路由配置条目:

    公共类 RouteConfig
    {
        公共静态无效注册路由(RouteCollection 路由)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            路线.MapRoute(
                “默认”,
                "{culture}/{controller}/{action}/{id}",
                新{文化= CultureHelper.GetDefaultCulture(),控制器=“家”,动作=“SetCulture”,id = UrlParameter.Optional}
            );
        }
    }

我应该如何修改 RouteConfig 以使 /elmah 正确显示?还是我看错地方了?

谢谢 :-)

4

1 回答 1

2

它是由一个名为 CultureAwareControllerActivator 的类引起的,该类实现了 IControllerActivator

我的知识有限,但似乎这个类(我自己添加的)在控制器激活时连接到请求并决定是否修改和重定向。

公共类 CultureAwareControllerActivator : IControllerActivator
{
    公共 IController 创建(RequestContext requestContext,类型控制器类型)
    {
        字符串cultureName = requestContext.RouteData.Values["culture"] 作为字符串;

        // 尝试从 Request 中读取文化 cookie
        if (cultureName == null)
            cultureName = requestContext.HttpContext.Request.UserLanguages != null && requestContext.HttpContext.Request.UserLanguages.Length > 0
                ? requestContext.HttpContext.Request.UserLanguages[0]
                : 无效的; // 从 HTTP 头 AcceptLanguages 获取

        // 验证文化名称
        CultureName = CultureHelper.GetImplementedCulture(cultureName); // 这是安全的


        if (requestContext.RouteData.Values["culture"] as string !=cultureName && (string) requestContext.RouteData.Values["controller"] != "Elmah")
        {

            // 在 URL 中强制使用有效的文化
            requestContext.RouteData.Values["culture"] =cultureName.ToLowerInvariant(); // 也小写

            // 重定向用户
            requestContext.HttpContext.Response.RedirectToRoute(requestContext.RouteData.Values);
        }


        // 修改当前线程的文化            
        Thread.CurrentThread.CurrentCulture = new CultureInfo(cultureName);
        Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture;

        返回 DependencyResolver.Current.GetService(controllerType) 作为 IController;
    }
}
于 2015-01-23T11:57:57.903 回答