ฉันจะรับค่าฐานของเว็บไซต์ได้อย่างไร


183

ฉันต้องการที่จะเขียนวิธีผู้ช่วยเล็กน้อยซึ่งจะส่งกลับ URL พื้นฐานของเว็บไซต์ นี่คือสิ่งที่ฉันมาด้วย:

public static string GetSiteUrl()
{
    string url = string.Empty;
    HttpRequest request = HttpContext.Current.Request;

    if (request.IsSecureConnection)
        url = "https://";
    else
        url = "http://";

    url += request["HTTP_HOST"] + "/";

    return url;
}

มีอะไรผิดพลาดหรือเปล่าที่คุณจะนึกถึง ใครสามารถปรับปรุงสิ่งนี้ได้บ้าง



1
มีความเป็นไปได้ที่ซ้ำกันของฉันจะรับ URL พื้นฐานของ webapp ใน ASP.NET MVC ได้อย่างไร
Serj Sagan

คำตอบ:


324

ลองสิ่งนี้:

string baseUrl = Request.Url.Scheme + "://" + Request.Url.Authority + 
    Request.ApplicationPath.TrimEnd('/') + "/";

13
นี่เป็นคำตอบเดียวที่ฉันพบว่าเกี่ยวข้องกับกรณีที่ไซต์แอปพลิเคชันซึ่งเป็นลูกของเว็บไซต์ระดับบนสุดใน IIS
John

6
string.Format ("{0} {1} /" Request.Url.GetLeftPart (UriPartial.Authority), Request.ApplicationPath.TrimEnd ('/'))
diegohb

2
Request.Url.Scheme ไม่ทำงานเสมอเมื่อคุณมีการกำหนดค่า http ภายในและการเลิกจ้าง SSL สำหรับ https ภายในบนเซิร์ฟเวอร์ แต่ใช้ https * ภายนอก ในการหลีกเลี่ยงสิ่งนี้ฉันเพียงแค่สร้าง AppSetting Key "UrlScheme" ที่มีสภาพแวดล้อมที่มีค่าเป็น "http" หรือ "https" ตามเว็บไซต์ที่มีอยู่ การตั้งค่าใน web.config นี้สามารถเข้าถึงได้โดย ConfigurationManager.AppSettings ["Key"]
Ben Sewards

3
สิ่งนี้ไม่คำนึงถึงการทำโหลดบาลานซ์ของบัญชีซึ่งเกิดการถอดรหัสหรือส่งต่อพร็อกซี่ คุณสามารถจบลงด้วยที่อยู่ที่ไม่ถูกต้องโดยใช้สิ่งนี้ดังนั้นโปรดระวังและทราบว่าเว็บไซต์ของคุณถูกปรับใช้ที่ใด
Conor Gallagher

$ "{ System.Web.HttpContext. Current.Request.Url.GetLeftPart (UriPartial.Authority)} {System.Web.HttpContext.Cur rent.Request.ApplicationPath .TrimEnd ( '/')} /";
Ryan Penfold

166
string baseUrl = Request.Url.GetLeftPart(UriPartial.Authority)

แค่นั้นแหละ ;)


25
สิ่งนี้ไม่สามารถใช้ได้กับเส้นทางเสมือนหรือแอปพลิเคชัน คุณควรใช้ Request.ApplicationPath นอกเหนือจากส่วนด้านซ้าย
Warlock

URL พื้นฐานคือ httpx: //domain.com: [พอร์ต] / คุณต้องเพิ่มเส้นทางแอพด้วยตัวคุณเองเพื่อแก้ปัญหานี้
Pawel Cioch

9

GetLeftPartวิธีแก้ปัญหายอดนิยมไม่รองรับในเวอร์ชั่น PCL ของUriขออภัย GetComponentsอย่างไรก็ตามถ้าคุณต้องการพกพาสิ่งนี้ควรทำเคล็ดลับ:

uri.GetComponents(
    UriComponents.SchemeAndServer | UriComponents.UserInfo, UriFormat.Unescaped);

6

ฉันเชื่อว่าคำตอบข้างต้นไม่ได้พิจารณาเมื่อไซต์ไม่ได้อยู่ในรูทของเว็บไซต์

นี่คือตัวควบคุม WebApi:

string baseUrl = (Url.Request.RequestUri.GetComponents(
                    UriComponents.SchemeAndServer, UriFormat.Unescaped).TrimEnd('/') 
                 + HttpContext.Current.Request.ApplicationPath).TrimEnd('/') ;

จากภายในคอนโทรลเลอร์ใช้ Configuration.VirtualPathRoot เนื่องจากเป็นโฮสต์อิสระ
Darrel Miller

5

สำหรับฉันแล้ว @ warlock ดูเหมือนจะเป็นคำตอบที่ดีที่สุด แต่ฉันเคยใช้สิ่งนี้มาตลอดในอดีต;

string baseUrl = Request.Url.GetComponents(
    UriComponents.SchemeAndServer, UriFormat.UriEscaped)   

หรือในตัวควบคุม WebAPI

string baseUrl = Url.Request.RequestUri.GetComponents(
    UriComponents.SchemeAndServer, UriFormat.Unescaped)

ซึ่งมีประโยชน์ดังนั้นคุณสามารถเลือกรูปแบบการหลบหนีที่คุณต้องการ ฉันไม่ชัดเจนว่าทำไมมีการใช้งานที่แตกต่างกันสองแบบและเท่าที่ฉันสามารถบอกได้วิธีนี้และ @ warlock จะให้ผลลัพธ์ที่เหมือนกันในกรณีนี้ แต่ดูเหมือนว่าGetLeftPart()จะใช้กับmailtoแท็กเช่นของ Uri ที่ไม่ใช่เซิร์ฟเวอร์ได้เช่นกัน .


ส่งคืน URL ที่ไม่ถูกต้องสำหรับกรณีที่คุณอยู่หลังอุโมงค์ ngrok และ https
Mohammad Zekrallah

5

นี่เป็นวิธีการพิสูจน์ที่โง่กว่ามาก

VirtualPathUtility.ToAbsolute("~/");

โทร @ Daniel จะไม่กลับมาเพียงแค่/ถ้าคุณเป็นเจ้าภาพในโดเมนบางโปรแกรมเช่นyourserver / yourapplicationname / yourrootpath
vibs2006

@ vibs2006 แท้จริงแล้วมันเป็นคำถามที่น่าสงสัย
Daniel A. White

4

ฉันไปกับ

HttpContext.Current.Request.ServerVariables["HTTP_HOST"]

1
สิ่งนี้จะเพิ่มโปรโตคอล: (HttpContext.Request.ServerVariables ["HTTPS"] == "off"? "http: //": "https: //") + HttpContext.Request.ServerVariables ["HTTP_HOST"]
onemorecupofcoffee

4

จากสิ่งที่ Warlock เขียนฉันพบว่าจำเป็นต้องรูทพา ธ เสมือนหากคุณไม่ได้โฮสต์ที่รูทของเว็บของคุณ (ใช้งานได้กับตัวควบคุม MVC Web API)

String baseUrl = Request.RequestUri.GetLeftPart(UriPartial.Authority) 
+ Configuration.VirtualPathRoot;


1

มันใช้งานได้สำหรับฉัน

Request.Url.OriginalString.Replace(Request.Url.PathAndQuery, "") + Request.ApplicationPath;
  • Request.Url.OriginalString : ส่งคืนพา ธ ที่สมบูรณ์เหมือนกับที่แสดงในเบราว์เซอร์
  • Request.Url.PathAndQuery : คืนค่า (พา ธ ที่สมบูรณ์) - (ชื่อโดเมน + PORT)
  • Request.ApplicationPath : return "/" บนเซิร์ฟเวอร์ที่โฮสต์และ "ชื่อแอปพลิเคชัน" ในการปรับใช้ IIS ท้องถิ่น

ดังนั้นหากคุณต้องการเข้าถึงชื่อโดเมนของคุณให้พิจารณารวมชื่อแอปพลิเคชันไว้ในกรณีของ:

  1. การปรับใช้ IIS
  2. หากแอปพลิเคชันของคุณปรับใช้ในโดเมนย่อย

====================================

สำหรับ dev.x.us/web

มันคืนข้อความที่แข็งแกร่งนี้


0

กรุณาใช้รหัสด้านล่าง                           

string.Format("{0}://{1}", Request.url.Scheme, Request.url.Host);

โปรดอธิบายรหัสของคุณเพื่อให้ผู้ใช้รายอื่นเข้าใจการทำงานของมัน ขอบคุณ!
Ignacio Ara


-2

คุณสามารถเพิ่มในพอร์ตสำหรับไม่ใช่พอร์ต 80 / SSL ได้หรือไม่

สิ่งที่ต้องการ:

if (HttpContext.Current.Request.ServerVariables["SERVER_PORT"] != null && HttpContext.Current.Request.ServerVariables["SERVER_PORT"].ToString() != "80" && HttpContext.Current.Request.ServerVariables["SERVER_PORT"].ToString() != "443")
            {
                port = String.Concat(":", HttpContext.Current.Request.ServerVariables["SERVER_PORT"].ToString());
            }

และใช้สิ่งนั้นในผลสุดท้ายหรือไม่


6
Request.Url.Authorityจะรวมหมายเลขพอร์ตหากไม่เป็นมาตรฐาน
Andomar
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.