Tambahkan metode ekstensi ini ke kode Anda:
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));
}
Dan kemudian Anda dapat menjalankannya RequestContext.HttpContext.Request
properti.
Ada bug (dapat digerakkan samping, lihat di bawah) di Asp.Net yang muncul pada mesin yang menggunakan port selain port 80 untuk situs web lokal (masalah besar jika situs web internal diterbitkan melalui load-balancing pada IP virtual dan port digunakan secara internal untuk aturan penerbitan) dimana Asp.Net akan selalu menambahkan port padaAbsoluteUri
properti - bahkan jika permintaan asli tidak menggunakannya.
Kode ini memastikan bahwa url yang dikembalikan selalu sama dengan Url yang browser aslinya diminta (termasuk port - karena akan dimasukkan dalam header host) sebelum terjadi penyeimbangan beban, dll.
Setidaknya, itu terjadi di lingkungan kami (agak berbelit-belit!) :)
Jika ada proksi funky di antara yang menulis ulang header host, maka ini tidak akan berhasil.
Pembaruan 30 Juli 2013
Seperti yang disebutkan oleh @KevinJones dalam komentar di bawah - pengaturan yang saya sebutkan di bagian selanjutnya telah didokumentasikan di sini: http://msdn.microsoft.com/en-us/library/hh975440.aspx
Meskipun saya harus mengatakan saya tidak bisa membuatnya bekerja ketika saya mencobanya - tapi itu bisa saja saya membuat kesalahan ketik atau sesuatu.
Pembaruan 9 Juli 2012
Saya menemukan ini beberapa waktu yang lalu, dan bermaksud memperbarui jawaban ini, tetapi tidak pernah melakukannya. Ketika seorang upvote baru saja masuk pada jawaban ini saya pikir saya harus melakukannya sekarang.
'Bug' yang saya sebutkan di Asp.Net dapat dikontrol dengan nilai appSettings yang tampaknya tidak berdokumen - disebut 'aspnet:UseHostHeaderForRequest'
- yaitu:
<appSettings>
<add key="aspnet:UseHostHeaderForRequest" value="true" />
</appSettings>
Saya menemukan ini sambil melihat HttpRequest.Url
dalam ILSpy - ditunjukkan oleh --->
di sebelah kiri copy / paste berikut dari tampilan 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 */
...
Saya pribadi belum menggunakannya - tidak terdokumentasi dan karenanya tidak dijamin untuk tetap - namun mungkin melakukan hal yang sama seperti yang saya sebutkan di atas. Untuk meningkatkan relevansi dalam hasil pencarian - dan untuk mengakui orang lain yang seeems telah menemukan ini - yang 'aspnet:UseHostHeaderForRequest'
pengaturan juga telah disebutkan oleh Nick Aceves di Twitter