เพิ่มวิธีการขยายนี้ในรหัสของคุณ:
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 สำหรับเว็บไซต์ท้องถิ่น (เป็นปัญหาใหญ่หากเว็บไซต์ภายในเผยแพร่ผ่าน load-balancing บน IP เสมือน และพอร์ตจะใช้ภายในสำหรับการเผยแพร่กฎ) โดย Asp.Net จะเสมอเพิ่มพอร์ตในAbsoluteUri
ทรัพย์สิน - แม้ว่าคำขอเดิมไม่ได้ใช้มัน
รหัสนี้ทำให้มั่นใจได้ว่า url ที่ส่งคืนจะเท่ากับ Url ที่เบราว์เซอร์ร้องขอมาแต่แรก (รวมถึงพอร์ต - ซึ่งจะรวมอยู่ในส่วนหัวของโฮสต์) ก่อนที่จะมีการโหลดบาลานซ์ ฯลฯ
อย่างน้อยก็ทำในสภาพแวดล้อมของเรา (ค่อนข้างซับซ้อน!) :)
หากมีพร็อกซีขี้ขลาดใด ๆ ในระหว่างนั้นเขียนส่วนหัวของโฮสต์แล้วสิ่งนี้จะไม่ทำงานอย่างใดอย่างหนึ่ง
อัปเดต 30 กรกฎาคม 2556
ตามที่กล่าวถึงโดย @KevinJones ในความคิดเห็นด้านล่าง - การตั้งค่าที่ฉันพูดถึงในส่วนถัดไปได้รับการบันทึกไว้ที่นี่: http://msdn.microsoft.com/en-us/library/hh975440.aspx
แม้ว่าฉันจะต้องบอกว่าฉันไม่สามารถทำงานได้เมื่อฉันลอง - แต่นั่นอาจเป็นแค่ฉันพิมพ์ผิดหรือบางสิ่งบางอย่าง
อัปเดต 9 กรกฎาคม 2555
ฉันเจอเรื่องนี้เมื่อไม่นานมานี้และตั้งใจจะอัพเดตคำตอบนี้ แต่ไม่เคยทำ เมื่อ upvote เพิ่งมาในคำตอบนี้ฉันคิดว่าฉันควรทำตอนนี้
'ข้อผิดพลาด' ที่ฉันพูดถึงใน Asp.Net สามารถควบคุมได้ด้วยค่า appSettings ที่ไม่มีเอกสารซึ่งเรียกว่า'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 */
...
ฉันเองไม่ได้ใช้มัน - มันไม่มีเอกสารและดังนั้นจึงไม่รับประกันว่าจะติด - แต่มันอาจทำในสิ่งเดียวกันกับที่ฉันได้กล่าวไว้ข้างต้น เพื่อเพิ่มความเกี่ยวข้องในผลการค้นหา - และเพื่อรับทราบคนอื่นที่เห็นว่าค้นพบสิ่งนี้ - การ'aspnet:UseHostHeaderForRequest'
ตั้งค่าดังกล่าวได้รับการกล่าวถึงโดย Nick Aceves บน Twitter