[英]@Url.Content doesnt resolve absolute path on one server but does on another
We currently have two different servers on same domain. 目前,我们在同一域上有两台不同的服务器。 But one server resolves
但是一台服务器解析
@Url.Content("~/api/User")'
@ Url.Content( “〜/ API /用户”)”
as 如
http://domain.com/virtualdirectory/api/User
http://domain.com/virtualdirectory/api/User
where as other server doesnt resolve it absolutely; 其他服务器无法完全解决的地方; rather it resolves it relatively like
而是相对地解决它
api/user
API /用户
The code base is same and we are using MVC4. 代码库是相同的,我们正在使用MVC4。 I am not sure as to where we went wrong or if there is any IIS/DNS settings that need to be done in order to get this fixed.
我不确定问题出在哪里,或者是否需要进行任何IIS / DNS设置才能解决此问题。
All help is appreciated; 感谢所有帮助; thanks :)
谢谢 :)
This is related with the IIS Rewriting module in your IIS web server that return the path to http://domain.com/virtualdirectory/api/User
这与IIS Web服务器中的IIS重写模块有关,该模块将路径返回到
http://domain.com/virtualdirectory/api/User
Take a look on the part of source code of @Url.Content below: 看一下@ Url.Content的源代码部分:
private static string GenerateClientUrlInternal(HttpContextBase httpContext, string contentPath)
{
if (String.IsNullOrEmpty(contentPath))
{
return contentPath;
}
// can't call VirtualPathUtility.IsAppRelative since it throws on some inputs
bool isAppRelative = contentPath[0] == '~';
if (isAppRelative)
{
string absoluteContentPath = VirtualPathUtility.ToAbsolute(contentPath, httpContext.Request.ApplicationPath);
return GenerateClientUrlInternal(httpContext, absoluteContentPath);
}
// we only want to manipulate the path if URL rewriting is active for this request, else we risk breaking the generated URL
bool wasRequestRewritten = _urlRewriterHelper.WasRequestRewritten(httpContext);
if (!wasRequestRewritten)
{
return contentPath;
}
// Since the rawUrl represents what the user sees in his browser, it is what we want to use as the base
// of our absolute paths. For example, consider mysite.example.com/foo, which is internally
// rewritten to content.example.com/mysite/foo. When we want to generate a link to ~/bar, we want to
// base it from / instead of /foo, otherwise the user ends up seeing mysite.example.com/foo/bar,
// which is incorrect.
string relativeUrlToDestination = MakeRelative(httpContext.Request.Path, contentPath);
string absoluteUrlToDestination = MakeAbsolute(httpContext.Request.RawUrl, relativeUrlToDestination);
return absoluteUrlToDestination;
}
Use the codes below to check whether your web servers are having the URL rewritten: 使用以下代码检查您的Web服务器是否已重写URL:
bool requestWasRewritten = (httpWorkerRequest != null && httpWorkerRequest.GetServerVariable("IIS_WasUrlRewritten") != null);
And Also: 并且:
private volatile bool _urlRewriterIsTurnedOnCalculated = false;
private bool _urlRewriterIsTurnedOnValue;
private object _lockObject = new object();
private bool IsUrlRewriterTurnedOn(HttpContextBase httpContext)
{
// Need to do double-check locking because a single instance of this class is shared in the entire app domain (see PathHelpers)
if (!_urlRewriterIsTurnedOnCalculated)
{
lock (_lockObject)
{
if (!_urlRewriterIsTurnedOnCalculated)
{
HttpWorkerRequest httpWorkerRequest = (HttpWorkerRequest)httpContext.GetService(typeof(HttpWorkerRequest));
//bool urlRewriterIsEnabled = (httpWorkerRequest != null && httpWorkerRequest.GetServerVariable(UrlRewriterEnabledServerVar) != null);
bool urlRewriterIsEnabled = (httpWorkerRequest != null && httpWorkerRequest.GetServerVariable("IIS_UrlRewriteModule") != null);
_urlRewriterIsTurnedOnValue = urlRewriterIsEnabled;
_urlRewriterIsTurnedOnCalculated = true;
}
}
}
return _urlRewriterIsTurnedOnValue;
}
In summary, If both requestWasRewritten and IsUrlRewriterTurnedOn return true, that means one of your web server has IIS Rewrite Module turned on and running while the other one doesn't have.
总之,如果requestWasRewrite和IsUrlRewriterTurnedOn都返回true,则意味着您的Web服务器之一已打开IIS Rewrite Module并正在运行,而另一服务器则没有。
For more details on ASP.NET MVC source codes, please refer to this link: 有关ASP.NET MVC源代码的更多详细信息,请参考以下链接:
http://aspnetwebstack.codeplex.com/
Hope it helps! 希望能帮助到你!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.