2014-01-20 3 views
0

현재 동일한 도메인에 두 개의 서로 다른 서버가 있습니다. 그러나 하나 개의 서버가 해결@ Url.Content는 한 서버에서 절대 경로를 확인하지 않지만 다른 서버에서 절대 경로를 확인하지 않습니다.

Url.Content ("~/API/사용자") '

http://domain.com/virtualdirectory/api/User

경우 다른 서버 나던 해결 등

같은 @

그것은 절대적으로; 오히려 상대적으로

API/사용자

코드베이스는 동일하며 우리가 MVC4를 사용하는 것처럼를 해결합니다. 우리가 어디로 잘못 갔는지 또는이 문제를 해결하기 위해 수행해야하는 IIS/DNS 설정이 있는지 확실하지 않습니다.

모든 도움을 주실 수 있습니다. 감사합니다 :)

+0

문서에서는 이것이 절대 경로를 생성한다고 말하지만 내부 구현이 클라이언트 측에서 올바르게 작동하는 URL을 반환합니다 ('PathHelpers.GenerateClientUrl'을 호출합니다). 두 번째 앱이 서버의 루트 또는 가상 디렉터리에 설치되어 있습니까? – JotaBe

+0

둘 다 응용 프로그램으로 설치되며 해당 AppPool 및 사용 권한은 모두 동일합니다. – Salman

답변

2

이이 http://domain.com/virtualdirectory/api/User

의 경로를 반환하여 IIS 웹 서버에 모듈을 다시 쓰기 IIS가의 소스 코드의 일부에 봐와 관련 @ 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; 
} 
또한

bool requestWasRewritten = (httpWorkerRequest != null && httpWorkerRequest.GetServerVariable("IIS_WasUrlRewritten") != null); 

그리고 :

웹 서버가 URL을 다시 쓴가있는 여부를 확인하기 위해 아래의 코드를 사용

요약
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; 
     } 

, 웹 서버 중 하나를 의미 반환 사실 requestWasRewritten 및 IsUrlRewriterTurnedOn, 모두 IIS 재 작성 모듈 가 켜져 있고 다른 하나는없는 동안 실행되어있는 경우.

ASP.NET MVC 소스 코드에 대한 자세한 내용은

,이 링크를 참조하십시오

http://aspnetwebstack.codeplex.com/ 

는 희망이 도움이!