Sitenin baseurl'unu nasıl edinebilirim?


183

Sitenin temel URL'sini döndüren küçük bir yardımcı yöntem yazmak istiyorum. Ben geldi budur:

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;
}

Bu konuda aklınıza gelebilecek herhangi bir hata var mı? Herkes bunu geliştirebilir mi?



Yanıtlar:


324

Bunu dene:

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

13
Bu, bir sitenin IIS'deki en üst düzey bir web sitesinin alt öğesi olan bir uygulamanın olduğu durumla ilgilenen tek cevaptır.
John

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

2
Bir sunucuda dahili https için dahili http yapılandırılmış ve SSL sonlandırması kurduğunuzda, ancak https * dışında çalıştırıldığında Request.Url.Scheme her zaman çalışmaz. Bu sorunu çözmek için, web sitesinin bulunduğu yere göre "http" veya "https" değerine sahip, çevreye özgü bir AppSetting Anahtarı "UrlScheme" yaptım. Web.config dosyasındaki bu ayara ConfigurationManager.AppSettings ["Anahtar"] tarafından erişilebilir
Ben Sewards

3
Bu, şifre çözmenin meydana geldiği yük dengelemesini veya vekilleri hesaba katmaz. Bunu kullanarak yanlış bir adrese sahip olabilirsiniz, bu yüzden dikkatli olun ve web sitenizin nereye dağıtıldığını bilin.
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)

Bu kadar ;)


25
Bu Sanal veya Uygulama Yolu için çalışmaz. Sol kısma ek olarak Request.ApplicationPath kullanmalısınız.
Warlock

base url httpx: //alan-adi.com.tr: [port] / Bu çözüme kendinizi uygulama yolu eklemelisiniz
Pawel Cioch

9

Popüler GetLeftPartçözüm Urimaalesef PCL sürümünde desteklenmiyor . GetComponentsAncak, taşınabilirliğe ihtiyacınız varsa, bu hile yapmalıdır:

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

6

Sitenin web sitesinin kökünde olmadığında yukarıdaki cevapların dikkate alınmadığına inanıyorum.

Bu bir WebApi denetleyicisidir:

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

Bir denetleyiciden, ana bilgisayardan bağımsız olduğu için Configuration.VirtualPathRoot kullanın.
Darrel Miller

5

Bana göre, @ warlock şimdiye kadarki en iyi cevap gibi görünüyor, ama bunu geçmişte hep kullandım;

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

Veya bir WebAPI denetleyicisinde;

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

hangi kullanışlı kaçış biçimini seçebilirsiniz böylece kullanışlı. Neden böyle iki farklı uygulama olduğunu açıklayamıyorum ve anlayabildiğim kadarıyla, bu yöntem ve @ warlock'un bu durumda tam olarak aynı sonucu döndürdüğü, ancak aynı GetLeftPart()zamanda sunucu olmayan Uri'nin benzer mailtoetiketleri için de işe yarayacağı gibi görünüyor .


ngrok tüneli ve https'nin arkasında olduğunuz durumlarda geçersiz URL döndürür
Mohammad Zekrallah


4

ile gidiyorum

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

1
Bu protokolü ekleyecektir: (HttpContext.Request.ServerVariables ["HTTPS"] == "off"? "Http: //": "https: //") + HttpContext.Request.ServerVariables ["HTTP_HOST"]
onemorecupofcoffee

4

Warlock'un yazdıklarına dayanarak, web'inizin kökünde bulunmuyorsanız sanal yol köküne ihtiyaç olduğunu buldum. (Bu, MVC Web API denetleyicileri için çalışır)

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

1

Application_Start aşağıdaki kodu kullanıyorum

String baseUrl = Path.GetDirectoryName(HttpContext.Current.Request.Url.OriginalString);


1

Bu benim için çalışıyor.

Request.Url.OriginalString.Replace(Request.Url.PathAndQuery, "") + Request.ApplicationPath;
  • Request.Url.OriginalString : tarayıcı yolunun tam yolunu döndürür.
  • Request.Url.PathAndQuery : (tam yol) - (etki alanı adı + PORT) değerlerini döndürür.
  • Request.ApplicationPath : barındırılan sunucuda "/" ve yerel IIS dağıtımında "uygulama adı" döndürür.

Dolayısıyla, alan adınıza erişmek istiyorsanız aşağıdaki durumlarda uygulama adını eklemeyi düşünün:

  1. IIS dağıtımı
  2. Uygulamanız alt etki alanına dağıtılmışsa.

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

Dev.x.us/web için

bu güçlü metni döndürüyor


0

Lütfen aşağıdaki kodu kullanın                           

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

Lütfen diğer kullanıcıların işlevlerini anlayabilmesi için kodunuzu açıklayın. Teşekkürler!
Ignacio Ara


-2

80 / SSL dışı bağlantı noktası için bağlantı noktasını ekleyebilir misiniz?

gibi bir şey:

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());
            }

ve nihai sonuçta kullanmak?


6
Request.Url.Authoritystandart değilse port numarasını içerecektir
Andomar
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.