UrlHelper.Action возвращает пустую строку

Очень странная проблема, я потратил часы, но не смог найти, в чем проблема. У меня есть код следующим образом:

    public static string AbsoluteAction(this UrlHelper urlHelper, string actionName, string controllerName, object routeValues)
    {
        return ResolveUrl(urlHelper, urlHelper.Action(actionName, controllerName, routeValues));
    }

    private static string ResolveUrl(UrlHelper urlHelper, string relativeUrl)
    {
        return new Uri(GetRequestUri(urlHelper), relativeUrl).AbsoluteUri;
    }

    private static Uri GetRequestUri(UrlHelper urlHelper)
    {
        return urlHelper.RequestContext.HttpContext.Request.Url;
    }

При использовании string.Empty как routeValues, "urlHelper.Action(actionName, controllerName, routeValues)" хорошо работает на моей локальной машине dev. (Windows 7, IIS 7.5,.Net 4.0, MVC3) Он возвращает правильный URL.

Но он возвращает пустую строку на нашем сервере непрерывной интеграции. (Windows Server 2008, IIS 7.0,.Net 4.0, MVC3)

Это конфигурация маршрута:
routes.MapRoute(
               "MyRouteName",
               "Getaddresses/{} почтовый индекс /",
              new {controller = "Address", action = "GetAddresses", postcode = string.Empty},
              new {httpMethod = new HttpMethodConstraint ( "GET" )}, новый [] { "My.Package.Controllers" });

Если я использую некоторую строку, а не string.Empty как RouteValues, она хорошо работает на обеих машинах.

Кажется, что проблема вызвана различными конфигурациями или другой версией инструментов или фреймворков на dev-машине и машине CI. Помогает ли кто-нибудь?

Чтобы лучше понять эту проблему, это контекст: Команда использует .Net 3.5, Visual Studio 2010, MVC2. Я обновил их до .Net 4.0, Visual Studio 2012, MVC3. На моей локальной машине Dev все нормально. Я установил .Net 4.0 и MVC3 на CI-сервере (не такие же установочные файлы для dev-машины, потому что они установлены вместе с визуальной студией). Веб-сайт работает на сервере CI. Единственная проблема заключается в том, что один smoke test не работает, ожидая, что "localhost/getaddresses" будет возвращен при вызове AbsoluteAction ( "имя действия", "имя контроллера", новый {postcode = string.Empty}), но на самом деле это "локальный"

Надеюсь, я хорошо описал проблему.:)

Большое спасибо!

+5
источник поделиться

Посмотрите другие вопросы по метке или Задайте вопрос