2008-09-15 17 views
92

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

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

http://www.domainname.com/subdir/ उपज http://www.domainname.com http://www.sub.domainname.com/subdir/ उपज चाहिए http://sub.domainname.com

एक गाइड के रूप में करना चाहिए, मैं "/Folder/Content/filename.html" की तरह एक यूआरएल को जोड़ने के लिए सक्षम होना चाहिए (उदाहरण के रूप में एएसपी.नेट एमवीसी में Url.RouteUrl() द्वारा उत्पन्न) सीधे यूआरएल पर और इसे काम करना चाहिए।

+3

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

+1

तो क्या "आधिकारिक यूआरएल" (आईआईएस से एक?) प्राप्त करने का कोई तरीका है –

उत्तर

166

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

Request.Url.Scheme + System.Uri.SchemeDelimiter + Request.Url.Host + 
(Request.Url.IsDefaultPort ? "" : ":" + Request.Url.Port) 
+3

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

+2

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

+8

आप 'Request.Url.Authority' का उपयोग कर सकते हैं क्योंकि Korayem' Request.Url.Host' और 'request.Url के बजाय सुझाया गया है .Port'। – Schmalls

34

प्रति this link के रूप में एक अच्छा प्रारंभिक बिंदु है:

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 विन्यास पर निर्भर करेगा।

इस तरह, आपको कार्लोस मुनोज से ऊपर Accepted Answer में IsDefaultPort का उपयोग करना चाहिए।

+1

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

+0

हाँ नोट देखें कि पोर्ट 80 एक बुरा विचार हो सकता है। मुझे इस बारे में किसी और तरीके से पता नहीं है, हालांकि मैंने इसका उल्लेख किया है कि इसे विन्यास पर निर्भर होना चाहिए। –

+1

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

-1

कैसे के बारे में:

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

बुरा नहीं है, लेकिन क्या होगा यदि आपकी साइट के पास सुरक्षित पृष्ठ हैं यानी https: // क्या होगा यदि आपका डोमेन पोर्ट 80 पर होस्ट नहीं किया गया है? –

0

कैसे के बारे में:

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

एक और तरीका है:


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

चेतावनी!वर्तमान का उपयोग करने वाले किसी भी व्यक्ति के लिए।। यूआरएल.होस्ट। समझें कि आप वर्तमान अनुरोध के आधार पर काम कर रहे हैं और वर्तमान अनुरोध हमेशा आपके सर्वर के साथ नहीं होगा और कभी-कभी अन्य सर्वरों के साथ भी हो सकता है।

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

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

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

+0

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

+0

i _think_ मैं समझता हूं, हालांकि - आपके सर्वर ने प्रॉक्सीफायर क्यों मारा? क्या यह आपकी साइट है? लेकिन, कुल मिलाकर, समझ में आता है - एप्लिकेशन-विशिष्ट ईवेंट के दौरान अनुरोध-विशिष्ट ऑब्जेक्ट का उपयोग करना बहुत अच्छा काम नहीं कर सकता है। अनुरोध-विशिष्ट घटना में कोई खतरा है, जैसे पृष्ठ जीवन चक्र ईवेंट (पृष्ठ। लोड पूर्ण, आदि)? – mlhDev

+0

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

12

Request.Url.Authority

का प्रयोग क्यों न यह पूरे डोमेन और बंदरगाह देता है।

तुम अब भी http या https

+1

यह भी काम करता है। http या https को "आंकड़ा" करने के लिए, सिमप्पी डालें "// "इससे पहले। तो उदाहरण के लिए यह href =" // @ request.Url.Authority ... " – EdwardM

23
Request.Url.GetLeftPart(UriPartial.Authority) 

यह योजना शामिल है लगाने की जरूरत है।

+16

के रूप में पढ़ेगा, जब वे उस नाम से आए तो मीटिंग में रहना अच्छा लगेगा –

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

सरल और कम रास्ता (यह स्कीमा, डोमेन है और बंदरगाह का समर्थन):

var MyUri= Request.UrlReferrer; 

// Use this like: 
Var fullDomain = myUri.Scheme + Uri.SchemeDelimiter + myUri.Authority; 

// Example output: https://www.example.com:5031 
// Example output: http://www.example.com:5031 
// Example output: https://www.example.com 
संबंधित मुद्दे

 संबंधित मुद्दे