Geçerli etki alanını almak için ASP.NET'te en iyi yöntem nedir?


102

ASP.NET'te geçerli etki alanını almanın en iyi yolunun ne olduğunu merak ediyorum?

Örneğin:

http://www.domainname.com/subdir/ vermelidir http://www.domainname.com http://www.sub.domainname.com/subdir/ vermelidir http://sub.domainname.com

Kılavuz olarak, "/Folder/Content/filename.html" (ASP.NET MVC'de Url.RouteUrl () tarafından oluşturulmuş gibi) gibi bir url'yi doğrudan URL'ye ekleyebilmeli ve çalışmalıdır.


3
Buradaki "geçerli alan adı" aslında, tüketici kullanıcı aracısının sitenize ulaşmak için kullandığı şey olduğunu ve çoğu durumda sitenizin "resmi URL'sinden" ve son kullanıcının tarayıcısına girmiş olabileceğinden ( ters proxy, ileri proxy, dahili ana bilgisayar adı, IP adresi, ...).
bzlm

1
Öyleyse "resmi URL" yi (IIS'den gelen) almanın bir yolu var mı?
Matt Mitchell 01.09

Yanıtlar:


186

MattMitchell'inki ile aynı cevap, ancak bazı değişikliklerle. Bu, bunun yerine varsayılan bağlantı noktasını kontrol eder.

Düzenleme: Güncellenmiş sözdizimi ve Request.Url.Authorityönerilen şekilde kullanılıyor

$"{Request.Url.Scheme}{System.Uri.SchemeDelimiter}{Request.Url.Authority}"

3
":" Yerine kullanabileceğim, i .NET olarak tanımlanmış bir alan var mı? System.Uri.PortDelimiter gibi bir şey mi? Biliyorsun, sadece tutarlılık için. :)
Jan Aagaard

2
Bildiğim kadarıyla değil, Jan Aagaard, ama her zaman yerel olarak yapabilirsin. Bunu çoğu "sihirli" dizge ve sayı için yapıyorum. Bu konuda Carlos'un cevabında "" yerine string.Empty kullanırsınız;)
vbullinger

8
Request.Url.AuthorityKorayem'in Request.Url.Hostve yerine önerdiği şekilde kullanabilirsiniz Request.Url.Port.
Schmalls

4
Dizeleri birleştirmek yerine System.UriBuilder sınıfını kullanmalısınız.
BrainSlugs83

3
@MattMitchell, Authority ile ilgili sorunları kurmamış gibi görünüyor, Host + ":" + Port ile eşdeğerdir, bkz. Kaynak kodu dotnetframework.org/default.aspx/DotNET/DotNET/8@0/untmp/…
Giuseppe Romagnuolo

40

Gereğince bu bağlantı iyi bir başlangıç noktasıdır:

Request.Url.Scheme + System.Uri.SchemeDelimiter + Request.Url.Host 

Ancak, etki alanı http://www.domainname.com:500 ise bu başarısız olacaktır.

Aşağıdakine benzer bir şey bunu çözmek için caziptir:

int defaultPort = Request.IsSecureConnection ? 443 : 80;
Request.Url.Scheme + System.Uri.SchemeDelimiter + Request.Url.Host 
  + (Request.Url.Port != defaultPort ? ":" + Request.Url.Port : "");

Ancak, 80 ve 443 numaralı bağlantı noktaları yapılandırmaya bağlı olacaktır.

Bu nedenle, yukarıda Carlos Muñoz IsDefaultPorttarafından verilen Kabul Edilen Cevapta olduğu gibi kullanmalısınız .


1
Neden 80 numaralı bağlantı noktasını burada varsayalım? Bu varsayımı kaldırırsanız, kod bir tümünü yakalama gibi görünür. Bağlantı noktası 80'i varsaydığınızda, birçok senaryoda başarısız olursunuz (diğer yanıtlarla ilgili yorumlara bakın). Mümkünse bağlantı noktası numarasını kaldırmak isterseniz, bağlantı noktası numarasının söz konusu şema için varsayılan olduğunu ve şemanın varsayılan bağlantı noktası numaralarını desteklediğini kontrol etmelisiniz.
bzlm

Evet, 80 numaralı bağlantı noktasının kötü bir fikir olabileceği notuna bakın. Bunun başka bir yolunu bilmiyorum, bu yüzden yapılandırmaya bağlı olması gerekeceğinden bahsetmiştim.
Matt Mitchell

1
Bunun yardımcı olup olmayacağını bilmiyorum ama şunu da deneyebilirsiniz: If Request.IsSecureConnection HTTPS kullanılıp kullanılmadığını belirlemek için?
Erick Brown

1
@EricBrown - Evet, bu yanıt 5 yıl sonra retropsect için pek iyi değil. Bu sorundan kaçınmak için Carlos Muñoz'un kabul ettiği cevabı tercih ederim.
Matt Mitchell

29
Request.Url.GetLeftPart(UriPartial.Authority)

Bu dahil şeması.


23
Bu isimle geldiklerinde toplantıda olmayı çok isterdim
Simon_Weaver

20

UYARI! Current.Request .Url.Host kullanan herkes için . GÜNCEL İSTEĞE göre çalıştığınızı ve mevcut isteğin HER ZAMAN sunucunuzda olmayacağını ve bazen başka sunucularda olabileceğini anlayın.

Dolayısıyla, bunu Global.asax içindeki Application_BeginRequest () gibi bir şeyde kullanırsanız,% 99,9 oranında sorun olmaz, ancak% 0,1 kendi sunucunuzun ana bilgisayar adından başka bir şey elde edebilirsiniz.

Bunun güzel bir örneği, kısa süre önce keşfettiğim bir şey. Sunucum zaman zaman http://proxyjudge1.proxyfire.net/fastenv'e ulaşma eğilimindedir . Application_BeginRequest () bu isteği memnuniyetle yerine getirir, böylece bu isteği yaparken Request.Url.Host'u çağırırsanız proxyjudge1.proxyfire.net'i geri alırsınız. Bazılarınız "hayır duh" diye düşünüyor olabilir ama kayda değer çünkü sadece% 0,1 oranında gerçekleştiği için fark edilmesi çok zor bir hataydı: P

Bu hata beni alan barındırıcımı yapılandırma dosyalarına bir dize olarak eklemeye zorladı.


Tam olarak aynısını yaptı. Etki alanım artık web.config içinde.
Korayem

i düşünmek neden sunucu isabet proxyfire yapar - gerçi, anlıyorum? Bu senin siten mi? Ancak genel olarak mantıklıdır - uygulamaya özgü bir olay sırasında isteğe özgü bir nesnenin kullanılması çok iyi çalışmayabilir. Sayfa yaşam döngüsü olayı (Page.LoadCompleted, vb.) Gibi isteğe özgü bir olayda tehlike var mı?
mlhDev

Neden proxyfire'a dönüştüğünü çok fazla araştırmadım. Kesinlikle benim sitem değildi, ama bana Current.Request.Url'nin% 100 güvenilir olmadığını gösterdi. Çok sayıda araştırmadan sonra, aynı IP'ye çözümlenen birden çok NIC kartı, IP ve alan adı nedeniyle ana bilgisayar adınızı dinamik olarak belirlemenin kolay olmadığını keşfettim. Diğer sorunuz Matt'e gelince, ne demek istediğinizden emin değilim: (
Thirlan

yani bu yalnızca Application_BeginRequest'te meydana geldi mi? Ana bilgisayar üstbilgi ayarınız yoksa, IIS'nin bu isteği uygulamanıza nasıl gönderebileceğini anlamıyorum.
Simon_Weaver

@Thirlan - Buna benzer görünen bir sorunu gidermeye çalışıyorum. Alt etki alanını Request.Url.Host kullanarak almaya çalışıyorum ve 'genellikle' iyi çalışıyor, ancak her zaman değil. Bunun etrafında gerçekten bir yol var mı? İstekte doğru olabilecek başka bir şey gibi mi?
scojomodena

14

Neden kullanmıyorsun

Request.Url.Authority

Tüm alanı VE bağlantı noktasını döndürür.

Hâlâ http veya https'yi anlamanız gerekiyor


2
Bu da işe yarar. Http veya https'yi "anlamak" için önüne "//" koyun. Örneğin, href = "// @ Request.Url.Authority ..." şeklinde
okunur

2

Basit ve kısa yol (şema, etki alanı ve bağlantı noktasını destekler):

Kullanım Request.GetFullDomain()

// Add this class to your project
public static class HttpRequestExtensions{
    public static string GetFullDomain(this HttpRequestBase request)
    {
        var uri= request?.UrlReferrer;
        if (uri== null)
            return string.Empty;
        return uri.Scheme + Uri.SchemeDelimiter + uri.Authority;
    }
}

// Now Use it like this:
Request.GetFullDomain();
// Example output:    https://www.example.com:5031
// Example output:    http://www.example.com:5031
// Example output:    https://www.example.com

1

Diğer yol:


string domain;
Uri url = HttpContext.Current.Request.Url;
domain= url.AbsoluteUri.Replace(url.PathAndQuery, string.Empty);

Basit ama tek kelimeyle harika bir cevap!
Shiroy

1

Peki ya:

NameValueCollection vars = HttpContext.Current.Request.ServerVariables;
string protocol = vars["SERVER_PORT_SECURE"] == "1" ? "https://" : "http://";
string domain = vars["SERVER_NAME"];
string port = vars["SERVER_PORT"];

0

UriBuilder'ı Kullanma:

    var relativePath = ""; // or whatever-path-you-want
    var uriBuilder = new UriBuilder
    {
        Host = Request.Url.Host,
        Path = relativePath,
        Scheme = Request.Url.Scheme
    };

    if (!Request.Url.IsDefaultPort)
        uriBuilder.Port = Request.Url.Port;

    var fullPathToUse = uriBuilder.ToString();

-1

Peki ya:

String domain = "http://" + Request.Url.Host

Fena değil, ama ya sitenizin güvenli sayfaları varsa, örneğin https: // Ya alanınız 80 numaralı bağlantı noktasında barındırılmıyorsa?
Matt Mitchell
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.