Bu uzantı yöntemini kodunuza ekleyin:
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));
}
Ve sonra bunu RequestContext.HttpContext.Request
mülkten yürütebilirsiniz .
Asp.Net'te yerel web sitesi için 80 numaralı bağlantı noktasından başka bağlantı noktaları kullanan makinelerde (dahili web siteleri sanal IP'de yük dengeleme yoluyla yayınlanıyorsa büyük bir sorun) ortaya çıkan bir hata var (yan basamaklı olabilir, aşağıya bakın). ve bağlantı noktaları dahili olarak yayınlama kuralları için kullanılır). Böylece, Asp.Net bağlantı noktasını her zamanAbsoluteUri
mülke ekler - orijinal istek kullanmasa bile.
Bu kod, döndürülen URL'nin, herhangi bir yük dengeleme vb. Gerçekleşmeden önce her zaman tarayıcının başlangıçta istediği URL'ye (bağlantı noktası da dahil olmak üzere) eşit olmasını sağlar .
En azından bizim (oldukça kıvrımlı!) Çevremizde var :)
Ana bilgisayar üstbilgisini yeniden yazan arasında funky proxy varsa, bu da işe yaramaz.
30 Temmuz 2013 Güncellemesi
@KevinJones tarafından aşağıdaki yorumlarda belirtildiği gibi - sonraki bölümde bahsettiğim ayar burada belgelenmiştir: http://msdn.microsoft.com/en-us/library/hh975440.aspx
Her ne kadar denediğimde işe yarayamayacağımı söylememe rağmen - ama bu sadece bir yazım hatası ya da bir şey yapmak olabilir.
Güncelleme 9 Temmuz 2012
Kısa bir süre önce bununla karşılaştım ve bu cevabı güncellemek istedim, ama hiç yapmadım. Bu cevapta yeni bir oylama geldiğinde şimdi yapmam gerektiğini düşündüm.
Asp.Net'te bahsettiğim 'hata', görünüşte belgelenmemiş bir appSettings değeri ile kontrol edilebilir - denir 'aspnet:UseHostHeaderForRequest'
- ie:
<appSettings>
<add key="aspnet:UseHostHeaderForRequest" value="true" />
</appSettings>
Bakarken bu geldi HttpRequest.Url
ILSpy içinde - ile gösterilen --->
aşağıdaki kopyanın soldaki / o ILSpy görünümünden yapıştırın:
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 */
...
Ben şahsen kullanmadım - belgesiz ve bu yüzden etrafta dolaşmayı garanti etmiyoruz - ancak yukarıda bahsettiğim şeyi yapabilir. Arama sonuçlarındaki alaka düzeyini artırmak ve bunu keşfettiğini gören başka birini kabul etmek için - bu 'aspnet:UseHostHeaderForRequest'
ayar Twitter'da Nick Aceves tarafından da belirtildi