非常に奇妙な問題です。何時間も費やしましたが、正確に何が問題なのかを見つけることができませんでした。次のようなコードがあります。
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)" がローカルの開発マシンでうまく機能します。(Windows 7、IIS 7.5、.Net 4.0、MVC3) 正しい URL を返します。
しかし、継続的インテグレーション サーバーでは空の文字列が返されます。(Windows サーバー 2008、IIS 7.0、.Net 4.0、MVC3)
これはルート構成です:
routes.MapRoute(
"MyRouteName",
"getaddresses/{postcode}/",
new { controller = "Address", action = "GetAddresses", postcode = string.Empty },
new { httpMethod = new HttpMethodConstraint ("GET") }, new[] { "My.Package.Controllers" });
RouteValues として string.Empty ではなく何らかの文字列を使用すると、両方のマシンでうまく機能します。
この問題は、開発マシンと CI マシンのツールまたはフレームワークの構成またはバージョンが異なることが原因であると思われます。誰でも助けることができますか?
この問題をよりよく理解するために、これはコンテキストです: チームは .Net 3.5、Visual Studio 2010、MVC2 を使用しています。それらを.Net 4.0、Visual Studio 2012、MVC3にアップグレードしました。私のローカル開発マシンではすべて問題ありません。CIサーバーに.Net 4.0とMVC3をインストールしました(Visual Studioと一緒にインストールされるため、開発マシンと同じインストールファイルではありません)。Web サイトは CI サーバーで正常に動作しています。唯一の問題は、AbsoluteAction("action name", "controller name", new {postcode=string.Empty} ) を呼び出したときに "localhost/getaddresses" が返されることを期待する 1 つのスモーク テストが失敗することですが、実際には "localhost "
問題について十分に説明できたことを願っています。: )
どうもありがとう!