2013-08-26 66 views
7

Tôi cần phải tạo một URL tuyệt đối cho các tệp cụ thể trong ứng dụng ASP.NET MVC 4 của tôi. Tôi hiện đang thực hiện việc này bằng cách tạo đường dẫn tương đối qua Url.Content và sau đó sử dụng phương pháp mở rộng sau để tạo đường dẫn tuyệt đối.Tạo URL tuyệt đối chính xác khi chạy ứng dụng ASP.NET MVC trong Visual Studio Windows Azure Emulator

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)); 
} 

Khi chạy dưới Azure Emulator, URL thích hợp mà tôi cần phải tạo ra là http://127.0.0.1/myfile.jpg nhưng khi mã này thực hiện, số cổng trở lại như 81 vì vậy các URL được tạo ra là http://127:0.0.1:81/myfile.jpg. Tuy nhiên, nếu tôi truy cập vào http://127:0.0.1:81/myfile.jpg, tất nhiên không hoạt động như Trình mô phỏng Azure đang nghe trên cổng 80, không phải 81.

Tôi giả định điều này phải thực hiện với bộ cân bằng tải Azure Emulator/IIS Express, nhưng Tôi không chắc chắn mình cần phải thực hiện thay đổi gì đối với phương thức Url.Absolute của mình để trả lại URL chính xác.

Trả lời

7

Bạn có thể dựa vào Host tiêu đề đó đang được gửi đi bởi các khách hàng:

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

Tiêu đề máy chủ cũng sẽ bao gồm số cổng nếu nó tồn tại? ví dụ. nếu ứng dụng được triển khai hợp pháp tại, ví dụ: http://www.contoso.com:999/ tiêu đề sẽ là "www.contoso.com:999"? – user2719100

+0

Có. xem http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.23 – haim770

3

Tại sao không chỉ sử dụng @Url.Content("~/myfile.jpg");? này chuyển một ảo (tương đối) đường để một ứng dụng tuyệt đối con đường và các công trình finle trong IIS, bộ mô phỏng và khi triển khai. Xem UrlHelper.Content Method

+2

Đường dẫn tuyệt đối ứng dụng không phải là đường dẫn tuyệt đối. '/ Content/Img/myfile.jpg'! =' Http: // 127.0.0.1/Nội dung/Img/myfile.jpg ' – haim770

+0

@ haim770 là chính xác. Tôi cần đường dẫn tuyệt đối đầy đủ, bao gồm giao thức, tên miền và cổng. – user2719100

Các vấn đề liên quan