इस विस्तार विधि को अपने कोड में जोड़ें:
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));
}
और फिर आप इसे बंद कर सकते RequestContext.HttpContext.Request
हैं संपत्ति।
Asp.Net में एक बग (साइड-स्टेप्ड, नीचे देखें) हो सकता है जो उन मशीनों पर उत्पन्न होता है जो स्थानीय वेबसाइट के लिए पोर्ट 80 के अलावा अन्य पोर्ट का उपयोग करते हैं (एक बड़ा मुद्दा अगर आंतरिक वेब साइटों को वर्चुअल आईपी पर लोड-बैलेंसिंग के माध्यम से प्रकाशित किया जाता है और बंदरगाहों का उपयोग आंतरिक रूप से नियमों को प्रकाशित करने के लिए किया जाता है) जिससे Asp.Net हमेशाAbsoluteUri
संपत्ति पर पोर्ट जोड़ देगा - भले ही मूल अनुरोध इसका उपयोग न करें।
यह कोड सुनिश्चित करता है कि लौटाया गया url हमेशा किसी भी लोड-बैलेंसिंग आदि के होने से पहले मूल रूप से अनुरोध किए गए ब्राउज़र (पोर्ट सहित - जैसे कि इसे होस्ट हेडर में शामिल किया जाएगा) के बराबर होता है।
कम से कम, यह हमारे (बल्कि जटिल!) वातावरण में करता है :)
यदि बीच में हेडर को फिर से लिखने के बीच में कोई फंकी प्रॉक्सी हैं, तो यह भी काम नहीं करेगा।
अद्यतन 30 जुलाई 2013
जैसा कि नीचे दिए गए टिप्पणियों में @KevinJones द्वारा उल्लेख किया गया है - मैं अगले भाग में जिस सेटिंग का उल्लेख करता हूं, उसे यहां प्रलेखित किया गया है: http://msdn.microsoft.com/en-us/library/hh975440.aspx
हालांकि मुझे कहना है कि जब मैंने इसे आज़माया तो मुझे यह काम नहीं मिला - लेकिन यह सिर्फ मुझे टाइपो या कुछ बनाने के लिए हो सकता है।
अपडेट 9 जुलाई 2012
मैं थोड़ी देर पहले इस पर आया था, और इस उत्तर को अपडेट करने का मतलब था, लेकिन कभी नहीं किया। जब एक उत्थान बस इस जवाब पर आया तो मैंने सोचा कि मुझे इसे अभी करना चाहिए।
Asp.Net में जिस 'बग' का मैं उल्लेख करता हूं, उसे जाहिरा तौर पर अनपेक्षित एपसेटिंग मूल्य के साथ नियंत्रित किया जा सकता है - जिसे 'aspnet:UseHostHeaderForRequest'
- (यानी):
<appSettings>
<add key="aspnet:UseHostHeaderForRequest" value="true" />
</appSettings>
HttpRequest.Url
ILSpy में देखते हुए मुझे यह पता चला - --->
उस 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 */
...
मैंने व्यक्तिगत रूप से इसका उपयोग नहीं किया है - यह अनिर्दिष्ट है और इसलिए इसके चारों ओर छड़ी करने की गारंटी नहीं है - हालांकि यह वही काम कर सकता है जिसका मैं ऊपर उल्लेख करता हूं। खोज परिणामों में प्रासंगिकता बढ़ाने के लिए - और स्वीकार करने के लिए किसी और को, जो seeems इस खोज की है करने के लिए - सेटिंग भी ट्विटर पर निक Aceves से उल्लेख किया गया है'aspnet:UseHostHeaderForRequest'