2009-12-21 11 views
16

हाय सब, मुझे एएसपी.NET अनुप्रयोगों का परीक्षण करते समय एक विसंगति मिली है स्थानीय रूप से विजुअल स्टूडियो 2008 (कैसिनी) के साथ अंतर्निर्मित वेब सर्वर पर।अनुरोध ["होस्ट"] == "dev.testhost.com:1234" क्यों है जबकि Request.Url.Host == "localhost"

मैं अपने स्थानीय मशीन dev.testhost.com127.0.0.1 के साथ जोड़ पर एक मेजबान को सेट कर लेने के बाद से मैं एक आवेदन मेजबान कहा करते थे हैडर के आधार पर अपनी उपस्थिति को बदलने की जरूरत है यह।

हालांकि, जब मैं http://dev.testhost.com:1234/index.aspx का उपयोग करके अपने परीक्षण अनुप्रयोग का अनुरोध करता हूं, तो Request.Url.Host का मान हमेशा "localhost" होता है। जबकि Request.Headers["host"] का मान "dev.testhost.com:1234" है (जैसा कि मैं उन्हें दोनों होने की अपेक्षा करता हूं)।

मैं नहीं चिंतित हैं कि दूसरा मान पोर्ट संख्या, शामिल कर रहा हूँ, लेकिन मैं क्यों मेजबान के नाम पूरी तरह से अलग हैं के रूप में शक्तिशाली उलझन में हूँ! क्या किसी को पता है कि यह एक ज्ञात मुद्दा है, या डिजाइन द्वारा? या मैं मूर्ख हूँ ?!

मैं नहीं बल्कि, Request.Url.Host का उपयोग करेंगे कि कब से परीक्षण पोर्ट संख्या को निकाल देते हैं के लिए होने से बचा जाता है ... - संभवतः भ्रम पैदा के कारण निकाल दिया! - सैम

+0

एमएसडीएन दस्तावेज से यह अनुरोध की तरह दिखता है। यूआरएल को सर्वर पर भेजे गए अनुरोध से संबंधित होना चाहिए। Http://msdn.microsoft.com/en-us/library/system.web.httprequest.aspx से उद्धरण ... > ** HttpRequest क्लास ** > द्वारा भेजे गए HTTP मानों को पढ़ने के लिए ASP.NET सक्षम करता है एक वेब अनुरोध के दौरान एक ग्राहक। कैसीनी में चलते समय ऐसा नहीं लगता है ... अभी तक उत्तर के लिए धन्यवाद, लेकिन मुझे सच में विश्वास नहीं है कि मेजबान नाम के अनुरोध के लिए अलग-अलग रिपोर्ट की कोई अच्छी वजह नहीं है ऑब्जेक्ट ... –

उत्तर

9

Request.Headers["host"] सर्वर से कनेक्ट होने वाले एप्लिकेशन से प्राप्त मान है, जबकि दूसरा मान वह होता है जब सर्वर डोमेन नाम प्राप्त करने का प्रयास करता है।

ब्राउजर डोमेन नाम दर्ज करने के अनुरोध में उपयोग करता है क्योंकि इसका उपयोग आभासी डोमेन के मामले में किया जाता है। सर्वर सर्वर प्राथमिकताओं में से एक सेट की रिपोर्ट करता है, या इसे पहले पाया जाता है।

संपादित करें: कैसिनी के कोड को देखते हुए अगर यह कुछ विशेष सेटिंग्स का उपयोग करता है देखने के लिए, मैं निम्नलिखित कोड देखा:

public string RootUrl { 
    get { 
    if (_port != 80) { 
     return "http://localhost:" + _port + _virtualPath; 
    } 
    else { 
     return "http://localhost" + _virtualPath; 
    } 
    } 
} 

// 
// Socket listening 
// 

public void Start() { 
    try { 
    _socket = CreateSocketBindAndListen(AddressFamily.InterNetwork, IPAddress.Loopback, _port); 
    } 
    catch { 
    _socket = CreateSocketBindAndListen(AddressFamily.InterNetworkV6, IPAddress.IPv6Loopback, _port); 
    } 
    // … 
} 

स्पष्टीकरण है कि कैसिनी स्पष्ट संदर्भ स्थानीय होस्ट करने के लिए बनाता है लगता है, और रिवर्स डीएनएस लुकअप करने की कोशिश नहीं करता है। अलग-अलग, यह return "http://localhost" + _virtualPath; का उपयोग नहीं करेगा।

+0

ठीक है, सर्वर का आईपी पता 127.0.0.1 है। इसमें 2 होस्ट मैप किए गए हैं: \ windows \ system32 \ drivers \ etc \ hosts: ** localhost ** और ** dev.testhost.com ** हालांकि, जब मैं 'dev.testhost.com' टाइप करता हूं तो 'HttpContect.Current.Request.Url.Host'' localhost 'है? एक उत्पादन सर्वर पर, यह जो भी मैं टाइप करता हूं वह होगा। स्थानीय परीक्षण सर्वर (कैसिनी) लाइव सर्वर से अलग क्यों है? –

+0

मेजबान किस क्रम में परिभाषित हैं? शायद आदेश सर्वर द्वारा सूचित एक को प्रभावित करता है। – kiamlaluno

+0

मैंने बस मेजबानों के क्रम को बदलने की कोशिश की और इससे कोई फर्क नहीं पड़ता! अच्छा विचार हालांकि;) मुझे लगता है कि यह काम करेगा अगर यह काम करेगा, क्योंकि इसके लिए शायद एक रिवर्स डीएनएस लुकअप की आवश्यकता होगी यदि यह लगातार काम करना था, जो मुझे संदेह है कि वे एक साधारण ध्वनि वाली संपत्ति में डाल देंगे ... मुझे संदेह है कैसिनी में एक बग है जो इस विसंगति का कारण बनती है! –

1

यह क्या w3 specs क्या माइक्रोसॉफ्ट Uri.Host संपत्ति को रोकने के लिए माना जाता है बनाम कहना की बात है। नामकरण समान कार्यक्षमता प्रदान करने के लिए एमएस द्वारा एक प्रयास का संकेत नहीं देता है। फ़ंक्शन जिसमें पोर्ट नंबर शामिल हैं Uri.Authority है।

आपके द्वारा पोस्ट किए गए अपडेट के साथ, आप अभी भी एक ही समस्या का सामना कर रहे हैं, बस इसके एक अलग पहलू की जांच कर रहे हैं। Uri.Host property डब्ल्यू 3 चश्मा में परिभाषित शीर्षलेख के रूप में एक ही कार्य करने के लिए कहा गया स्पष्टीकरण या implicity नहीं है।

Uri.Host संपत्ति
इस उदाहरण के मेजबान घटक हो जाता है: लंबे रूप में, यहाँ Uri.Host MSDN पृष्ठ से कुछ उद्धरण हैं।

संपत्ति मूल्य

प्रकार: System.String

एक स्ट्रिंग होस्ट नाम मौजूद है। यह आमतौर पर सर्वर का DNS होस्ट नाम या आईपी पता होता है।

इस बात की कोई गारंटी नहीं है कि यह हेडर में क्या होगा, बस यह कि किसी रूप में होस्ट नाम का प्रतिनिधित्व करता है।

+0

आपके प्रयास के लिए धन्यवाद, लेकिन आपने सवाल को गलत तरीके से पढ़ा है, मैंने अभी कहा है कि बिट पर जोर दिया है ** मुझे कोई चिंता नहीं है कि दूसरे मूल्य में पोर्ट नंबर ** –

+0

मेरा उत्तर अभी भी लागू है - मैंने इसे आपके अपडेट में सहसंबंध को और अधिक स्पष्ट बनाने के लिए विस्तारित किया है, लेकिन आपकी मूल समस्या यह धारणा है कि 'System.Uri' ऑब्जेक्ट को सीधे उन http शीर्षलेखों से मेल खाना चाहिए जिन्हें आप' अनुरोध 'के साथ पुनर्प्राप्त कर रहे हैं .Headers'। – jball

+0

'System.Uri' वर्ग के ऑब्जेक्ट्स सामान्य रूप से यूआरआई का प्रतिनिधित्व करते हैं, मेरा प्रश्न' System.Url' ** इंस्टेंस ** 'System.Uri' क्लास के बारे में है, जैसा कि एक एएसपीएक्स पेज से पहुंचाया जा रहा है किसी विशेष यूआरएल के अनुरोध के कारण। संपत्ति 'Request.Uri'' का बिंदु क्या है यदि यह 'अनुरोध' के यूआरएल से मेल नहीं खाता है? स्पष्टीकरण के लिए, आप 'Request.Url.ToString()' पर कॉल कर सकते हैं और यह अभी भी 'http: // localhost: 1234/default.aspx' की रिपोर्ट करता है जबकि अनुरोध' http://dev.testhost.com के लिए था: 1234/Default.aspx' ... –

8

Request.Headers["host"] ब्राउज़र से http शीर्षलेख में निर्दिष्ट होस्ट है। (उदाहरण के लिए यह है कि आप फिडलर या एचटीपीवैच के साथ यातायात की जांच करते हैं)

हालांकि, एएसपी.नेट इस (और अन्य अनुरोध जानकारी) को System.Uri उदाहरण में लोड करता है, जो अनुरोध घटक को अपने घटक भागों में पार्स करता है । इस मामले में, "होस्ट" का मूल रूप से मूल अनुरोध का मेजबान मशीन भाग (उदाहरण के लिए बंदरगाह में टीसीपी बंदरगाह के साथ) संपत्ति का संदर्भ है।

यह System.Uri कक्षा एक बहुत ही उपयोगी सहायक वर्ग है जो आपके अनुरोध को अपने हिस्सों में विभाजित करने से बाहर निकलता है, जबकि "होस्ट:" (और उस मामले के लिए "हेडर") http हेडर से सिर्फ कच्चा होता है अनुरोध डेटा।

हालांकि दोनों के पास एक ही नाम है, लेकिन वे एक ही चीज़ होने के लिए नहीं हैं।

+0

आपके उत्तर के लिए धन्यवाद, मैं क्या सोच रहा हूं कि यह कैसे है 'splitting up' http://dev.testhost.com:1234/ परिणामस्वरूप 'dev.testhost.com' भाग को पूरी तरह से खो सकता है, और इसे बदल दिया है 'स्थानीय होस्ट'? मेरा सवाल वास्तव में उरी या उरीबिल्डर वर्गों के बारे में नहीं था, मैं उनको अच्छी तरह समझता हूं;) इसके अलावा, ** बंदरगाह संख्या यहां बिल्कुल समस्या नहीं है **। मैंने अपने प्रश्न के तीसरे अनुच्छेद में ** जोर ** जोड़ा है, शायद यह स्पष्ट हो जाएगा? धन्यवाद फिर से;) –

+0

अच्छा - आपने कहा है कि आपने आईपी पते 127.0.0.1 के साथ dev.testhost.com को जोड़ा है। हालांकि, यह आईपी पता हमेशा लोकहोस्ट पर जाता है (परिभाषा के अनुसार - यह लूपबैक पता है) - इसलिए 127.0.0.1 पर कोई नाम लुकअप स्थानीयहोस्ट पर मैप करेगा। जब आप कहते हैं कि "127.0.0.1 के साथ dev.testhost.com को जोड़ना" आपने यह कैसे किया? क्या आपने मेजबान फ़ाइल संपादित की है, या इसे किसी अन्य तरीके से करते हैं? –

+0

मैंने मेजबान फ़ाइल में प्रवेश जोड़ा। कृपया नीचे kiamlaluno का जवाब देखें ... ऐसा लगता है कि यह एक कैसिनी-विशिष्ट मुद्दा है ... –

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