Thêm phương thức mở rộng này vào mã của bạn:
public static Uri UrlOriginal(this HttpRequestBase request)
{
string hostHeader = request.Headers["host"];
return new Uri(string.Format("{0}://{1}{2}",
request.Url.Scheme,
hostHeader,
request.RawUrl));
}
Và sau đó bạn có thể thực hiện nó ra khỏi RequestContext.HttpContext.Request
tài sản.
Có một lỗi (có thể được đặt bên cạnh, xem bên dưới) trong Asp.Net phát sinh trên các máy sử dụng cổng ngoài cổng 80 cho trang web cục bộ (một vấn đề lớn nếu các trang web nội bộ được xuất bản thông qua cân bằng tải trên IP ảo và các cổng được sử dụng nội bộ cho các quy tắc xuất bản), theo đó Asp.Net sẽ luôn thêm cổng trên thuộc AbsoluteUri
tính - ngay cả khi yêu cầu ban đầu không sử dụng nó.
Mã này đảm bảo rằng url được trả về luôn bằng với Url mà trình duyệt yêu cầu ban đầu (bao gồm cả cổng - vì nó sẽ được bao gồm trong tiêu đề máy chủ) trước khi xảy ra bất kỳ cân bằng tải nào.
Ít nhất, nó làm trong môi trường (khá phức tạp!) Của chúng tôi :)
Nếu có bất kỳ proxy thú vị nào ở giữa đó viết lại tiêu đề máy chủ, thì điều này cũng không hoạt động.
Cập nhật ngày 30 tháng 7 năm 2013
Như được đề cập bởi @KevinJones trong các bình luận bên dưới - cài đặt tôi đề cập trong phần tiếp theo đã được ghi lại ở đây: http://msdn.microsoft.com/en-us/l Library / hh975440.aspx
Mặc dù tôi phải nói rằng tôi không thể làm cho nó hoạt động khi tôi thử nó - nhưng đó chỉ có thể là tôi mắc lỗi đánh máy hoặc một cái gì đó.
Cập nhật ngày 9 tháng 7 năm 2012
Tôi đã bắt gặp điều này một chút trước đây, và có nghĩa là để cập nhật câu trả lời này, nhưng không bao giờ làm. Khi một upvote vừa xuất hiện trong câu trả lời này, tôi nghĩ rằng tôi nên làm điều đó ngay bây giờ.
'Lỗi' tôi đề cập trong Asp.Net có thể được kiểm soát bằng giá trị cài đặt ứng dụng rõ ràng không có giấy tờ - được gọi là 'aspnet:UseHostHeaderForRequest'
- tức là:
<appSettings>
<add key="aspnet:UseHostHeaderForRequest" value="true" />
</appSettings>
Tôi đã bắt gặp điều này trong khi xem xét HttpRequest.Url
trong ILSpy - được biểu thị bằng --->
bên trái của bản sao / dán sau đây từ chế độ xem ILSpy đó:
public Uri Url
{
get
{
if (this._url == null && this._wr != null)
{
string text = this.QueryStringText;
if (!string.IsNullOrEmpty(text))
{
text = "?" + HttpEncoder.CollapsePercentUFromStringInternal(text,
this.QueryStringEncoding);
}
---> if (AppSettings.UseHostHeaderForRequestUrl)
{
string knownRequestHeader = this._wr.GetKnownRequestHeader(28);
try
{
if (!string.IsNullOrEmpty(knownRequestHeader))
{
this._url = new Uri(string.Concat(new string[]
{
this._wr.GetProtocol(),
"://",
knownRequestHeader,
this.Path,
text
}));
}
}
catch (UriFormatException)
{ }
}
if (this._url == null) { /* build from server name and port */
...
Cá nhân tôi đã không sử dụng nó - nó không có giấy tờ và do đó không được bảo đảm để dính xung quanh - tuy nhiên nó có thể làm điều tương tự mà tôi đã đề cập ở trên. Để tăng tính thích hợp trong kết quả tìm kiếm - và thừa nhận người khác người seeems đã phát hiện ra này - các 'aspnet:UseHostHeaderForRequest'
thiết lập cũng đã được đề cập bởi Nick Aceves trên Twitter