2013-08-26 6 views
7

Potrzebuję utworzyć bezwzględny adres URL do określonych plików w mojej aplikacji ASP.NET MVC 4. Obecnie robię to poprzez wygenerowanie względnej ścieżki przez Url.Content, a następnie za pomocą poniższej metody rozszerzenia utworzyć ścieżkę bezwzględną.Tworzenie prawidłowego bezwzględnego adresu URL podczas uruchamiania aplikacji ASP.NET MVC w programie Visual Studio Emulator Windows Azure

public static string Absolute(this UrlHelper url, string relativeUrl) 
{ 
    var request = url.RequestContext.HttpContext.Request; 
    return string.Format("{0}://{1}{2}{3}", 
     (request.IsSecureConnection) ? "https" : "http", 
     request.Url.Host, 
     (request.Url.Port == 80) ? "" : ":" + request.Url.Port, 
     VirtualPathUtility.ToAbsolute(relativeUrl)); 
} 

Podczas pracy pod Azure Emulator, właściwy adres, który trzeba utworzyć jest http://127.0.0.1/myfile.jpg ale po wykonaniu tego kodu, numer portu wraca jako 81 tak URL, który jest generowany jest http://127:0.0.1:81/myfile.jpg. Jeśli jednak przejdę do wersji http://127:0.0.1:81/myfile.jpg, to oczywiście nie działa, ponieważ emulator platformy Azure nasłuchuje na porcie 80, a nie 81.

Zakładam, że ma to związek z wbudowanym modułem równoważenia obciążenia Azure Emulator/IIS Express, ale Nie jestem pewien, jaką zmianę muszę wprowadzić w mojej metodzie, aby zwrócić dokładny adres URL.

Odpowiedz

7

Można polegać na nagłówku Host, które są przesyłane przez klienta:

public static string Absolute(this UrlHelper url, string relativeUrl) 
{ 
    var request = url.RequestContext.HttpContext.Request; 

    return string.Format("{0}://{1}{2}", 
     (request.IsSecureConnection) ? "https" : "http", 
     request.Headers["Host"], 
     VirtualPathUtility.ToAbsolute(relativeUrl)); 
} 
+0

Czy nagłówek hosta zawiera również numer portu, jeśli istnieje? na przykład. jeśli aplikacja zostanie prawidłowo wdrożona pod adresem http://www.contoso.com:999/ nagłówek będzie "www.contoso.com:999"? – user2719100

+0

Tak. zobacz http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.23 – haim770

3

Dlaczego po prostu nie używać @Url.Content("~/myfile.jpg");? Ten przekształca do wirtualnego (względne) ścieżka do aplikacja absolutnym ścieżki i działa finle IIS emulator a po wdrożeniu. Zobacz UrlHelper.Content Method

+2

Ścieżka bezwzględna aplikacji nie jest ścieżką bezwzględną. '/ Content/Img/myfile.jpg'! =' Http: // 127.0.0.1/Content/Img/myfile.jpg' – haim770

+0

@ haim770 jest poprawny. Potrzebuję pełnej bezwzględnej ścieżki, w tym protokołu, domeny i portu. – user2719100

Powiązane problemy