वर्तमान डोमेन प्राप्त करने के लिए ASP.NET में सबसे अच्छा तरीका क्या है?


102

मैं सोच रहा हूं कि ASP.NET में वर्तमान डोमेन प्राप्त करने का सबसे अच्छा तरीका क्या है?

उदाहरण के लिए:

http://www.domainname.com/subdir/ को http://www.domainname.com http://www.sub.domainname.com/subdir/ पर उपज देना चाहिए http://sub.domainname.com

एक गाइड के रूप में, मुझे URL पर सीधे ASP.NET MVC में "/Folder/Content/filename.html" (जैसा कि Url.RouteUrl () द्वारा उत्पन्न) कहना चाहिए और इसे काम करना चाहिए।


3
ध्यान दें कि "वर्तमान डोमेन" वास्तव में वह है जो उपभोग्य उपयोगकर्ता-एजेंट आपकी साइट पर प्राप्त करने के लिए उपयोग करते हैं, जो कई मामलों में आपकी साइट के "आधिकारिक URL" से अलग है और साथ ही अंत उपयोगकर्ता ने अपने ब्राउज़र में क्या दर्ज किया होगा ( रिवर्स प्रॉक्सी, फॉरवर्ड प्रॉक्सी, इंटरनल होस्टनाम, आईपी एड्रेस, ...)।
bzlm

1
तो क्या "आधिकारिक URL" (IIS से एक?) प्राप्त करने का एक तरीका है
मैट मिशेल

जवाबों:


186

MattMitchell के रूप में समान उत्तर लेकिन कुछ संशोधन के साथ। इसके बजाय डिफ़ॉल्ट पोर्ट के लिए जाँच करता है।

संपादित करें: Request.Url.Authorityसुझाए गए सिंटैक्स और उपयोग के अनुसार

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

3
क्या कोई फ़ील्ड i .NET परिभाषित है, जिसे मैं ":" के बजाय उपयोग कर सकता हूं? System.Uri.PortDelimiter जैसा कुछ? तुम जानते हो, सिर्फ संगति के लिए। :)
Jan Aagard

2
ऐसा नहीं है कि मुझे पता है कि, जान आगरार्ड, लेकिन आप हमेशा स्थानीय स्तर पर एक बना सकते हैं। मैं सबसे अधिक "जादू" के लिए तार और संख्या करता हूं। उस मामले के लिए, आप इसके बाद स्ट्रिंग का उपयोग करेंगे। कार्लोस के उत्तर में "" के बजाय खाली;)
vbullinger

8
आप उपयोग कर सकते हैं Request.Url.Authorityके रूप में Korayem बजाय सुझाव दिया Request.Url.Hostऔर Request.Url.Port
Schmalls

4
स्ट्रेंथनिंग के बजाय, आपको System.UriBuilder वर्ग का उपयोग करना चाहिए।
BrainSlugs83

3
@MattMitchell, ऐसा लगता है कि प्राधिकरण के साथ मुद्दों की स्थापना नहीं की गई है, यह होस्ट + के बराबर है: "+ पोर्ट, स्रोत कोड देखें dotnetframework.org/default.aspx/DotNET/DotNET/8/0/untmp/…
Giuseppe Romagnuolo

40

इस लिंक के अनुसार एक अच्छा प्रारंभिक बिंदु है:

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

हालाँकि, यदि डोमेन http://www.domainname.com:500 है तो यह विफल हो जाएगा।

इसे हल करने के लिए निम्नलिखित कुछ पसंद है:

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

हालाँकि, पोर्ट 80 और 443 कॉन्फ़िगरेशन पर निर्भर करेगा।

जैसे, आपको कार्लोस मुनोज़ के ऊपर दिए IsDefaultPortगए स्वीकृत उत्तर के रूप में उपयोग करना चाहिए ।


1
यहां पोर्ट 80 क्यों मानें? यदि आप उस धारणा को हटा देते हैं, तो कोड एक कैच-ऑल जैसा दिखता है। जब आप पोर्ट 80 मान लेते हैं, तो आप कई परिदृश्यों में विफल रहेंगे (अन्य एवर्स पर टिप्पणी देखें)। यदि आप संभव हो तो पोर्ट नंबर को हटाना चाहते हैं, तो आपको यह देखना होगा कि पोर्ट नंबर प्रश्न में स्कीम के लिए डिफ़ॉल्ट है, और यह कि स्कीम डिफॉल्ट पोर्ट नंबरों का समर्थन करती है।
bzlm

हाँ ध्यान दें कि पोर्ट 80 एक बुरा विचार हो सकता है। मैं इसके आसपास कोई अन्य तरीका नहीं जानता, हालांकि यही कारण है कि मैंने इसे विन्यास पर निर्भर होने की आवश्यकता है।
मैट मिशेल

1
मुझे नहीं पता कि इससे मदद मिलेगी या नहीं, लेकिन आप यह भी कोशिश कर सकते हैं: अगर HTTPS का उपयोग किया जाता है या नहीं, यह निर्धारित करने के लिए Request.IsSecureConnection?
एरिक ब्राउन

1
@EricBrown - हाँ, यह जवाब 5 साल बाद के रेट्रोस्पेक्ट में बहुत अच्छा नहीं है। मैं उस मुद्दे से बचने के लिए कार्लोस मुनोज़ के स्वीकृत जवाब के साथ जाऊँगा।
मैट मिशेल

29
Request.Url.GetLeftPart(UriPartial.Authority)

यह योजना शामिल है।


23
जब वे इस नाम के साथ आए तो मुझे अच्छा लगा जब मैं इस नाम से आया
सिमोन_विवर

20

चेतावनी! जो भी करंट का उपयोग करता है । Request .Url.Host। यह समझें कि आप CURRENT REQUEST के आधार पर काम कर रहे हैं और यह कि वर्तमान अनुरोध हमेशा आपके सर्वर के साथ नहीं होगा और कभी-कभी अन्य सर्वरों के साथ भी हो सकता है।

इसलिए यदि आप Global.asax में Application_BeginRequest () जैसे कुछ में इसका उपयोग करते हैं, तो 99.9% समय ठीक रहेगा, लेकिन 0.1% आपको अपने सर्वर के होस्ट नाम के अलावा कुछ मिल सकता है।

इसका एक अच्छा उदाहरण कुछ ऐसा है जिसकी खोज मैंने बहुत पहले नहीं की थी। मेरा सर्वर समय-समय पर http://proxyjudge1.proxyfire.net/fastenv हिट करने के लिए जाता है। Application_BeginRequest () ख़ुशी से इस अनुरोध को संभालता है, यदि आप Request.Url.Host को कॉल करते हैं, तो यह अनुरोध करने के बाद आप वापस कर लेंगे। आप में से कुछ सोच रहे होंगे "नो ड्यूह" लेकिन ध्यान देने योग्य है क्योंकि यह नोटिस करने के लिए बहुत कठिन बग था क्योंकि यह केवल 0.1% समय हुआ: पी

इस बग ने मुझे कॉन्फिग फाइलों में एक स्ट्रिंग के रूप में अपना डोमेन होस्ट डालने के लिए मजबूर किया है।


बिल्कुल वैसा ही किया। मेरा डोमेन अभी web.config में है।
कोरायेम

मुझे लगता है कि मैं समझता हूं, हालांकि - आपका सर्वर प्रॉक्सीफ़ायर को क्यों मारता है? क्या वह आपकी साइट है? लेकिन, कुल मिलाकर, यह समझ में आता है - एप्लिकेशन-विशिष्ट ईवेंट के दौरान अनुरोध-विशिष्ट ऑब्जेक्ट का उपयोग करना बहुत अच्छी तरह से काम नहीं कर सकता है। क्या पेज-लाइफ साइकल इवेंट (Page.LoadCompleted, आदि) जैसे अनुरोध-विशिष्ट ईवेंट में कोई ख़तरा है?
13

मैंने बहुत मुश्किल से जांच नहीं की कि यह प्रॉक्सीफायर को हल क्यों कर रहा है। यह निश्चित रूप से मेरी साइट नहीं थी, लेकिन इसने मुझे संकेत दिया कि Current.Request.Url 100% विश्वसनीय नहीं था। बहुत सारे शोध के बाद मुझे यह भी पता चला था कि गतिशील रूप से आपके होस्टनाम का निर्धारण करना आसान नहीं है, एक ही आईपी के लिए कई एनआईसी कार्ड, आईपी और डोमेन नाम के कारण। आपके अन्य प्रश्न मैट के लिए, मुझे यकीन नहीं है कि आपका क्या मतलब है:
14

तो यह केवल कभी भी Application_BeginRequest में घटित हुआ है? मैं यह नहीं देखता कि जब तक आपके पास कोई होस्ट हेडर नहीं होगा, तब तक IIS कैसे आपके ऐप पर यह अनुरोध भेज सकता है?
साइमन_वेवर

@Thirlan - मैं एक ऐसे मुद्दे पर बहस करने की कोशिश कर रहा हूं जो इस तरह से लगता है। मैं अनुरोध का उपयोग करके उपडोमेन प्राप्त करने की कोशिश कर रहा हूं। Url.Host और 'आमतौर पर' अच्छा काम करता है, लेकिन हमेशा नहीं। क्या वास्तव में इस के आसपास है? अनुरोध में कुछ और जैसा कि सही हो सकता है?
scojomodena

14

क्यों नहीं इस्तेमाल करते?

Request.Url.Authority

यह संपूर्ण डोमेन और पोर्ट लौटाता है।

आपको अभी भी http या https का पता लगाना होगा


2
यह भी काम करता है। इससे पहले "आंकड़ा" http या https, simlpy डाल "//"। इसलिए उदाहरण के लिए इसे href = "// @ Request.Url.Authority ..." के रूप में पढ़ा जाएगा
EdwardM

2

सरल और संक्षिप्त तरीका (यह स्कीमा, डोमेन और पोर्ट का समर्थन करता है):

उपयोग 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

दूसरा रास्ता:


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

सरल लेकिन बस भयानक जवाब!
शिरॉय

1

कैसा रहेगा:

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 का उपयोग करना:

    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

कैसा रहेगा:

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

बुरा नहीं है, लेकिन क्या होगा यदि आपकी साइट के पृष्ठ सुरक्षित हैं अर्थात https: // क्या होगा यदि आपका डोमेन पोर्ट 80 पर होस्ट नहीं है?
मैट मिशेल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.