2008-10-04 5 views
33

मैं उपयोगकर्ता को परिभाषित बंदरगाह पर प्रॉक्सी सेट करने की अनुमति देने के लिए HttpListener का उपयोग कर रहा हूं। जब मैं HttpListener शुरू करता हूं, तो Vista में व्यवस्थापक विशेषाधिकारों के तहत एप्लिकेशन नहीं चल रहा है, तो मुझे अपवाद मिलता है।क्या मैं व्यवस्थापक पोर्ट्स की आवश्यकता के बिना Vista पर एक पोर्ट (HttpListener या अन्य .NET कोड का उपयोग कर) पर सुन सकता हूं?

जो मैंने पढ़ा है, this is expected behavior - पोर्ट विशेषाधिकारों को बंदरगाह पर सुनना शुरू करने की आवश्यकता है। लेकिन मुझे यकीन है कि इसके आस-पास के तरीके हैं, क्योंकि मैं बहुत से कार्यक्रम चलाता हूं (जैसे स्काइप) जो बिना किसी पोर्ट को सुशोभित करने के लिए बंदरगाह पर सुनता है।

क्या HttpListener के साथ ऐसा करने का कोई तरीका है? यदि नहीं, तो क्या मैं बंदरगाह स्थापित करने के लिए .NET कोड में अन्य एपीआई कॉल कर सकता हूं?

+0

वाह, मुझे इसके बारे में पता नहीं था! आपके द्वारा प्रदान किए गए लिंक से यह किसी भी तरह से प्रतीत नहीं होता है। :( – leppie

उत्तर

9

मैंने कभी भी एक एचटीपी लिस्टर का उपयोग नहीं किया है, लेकिन आपके विवरण से यह एक सर्वर यूआरएल नेमस्पेस (जो एचटीपी लिस्टनर क्या करता है) में अपने एप्लिकेशन को एम्बेड करने के बजाय, नियमित टीसीपी पोर्ट पर सुनना चाहता है। आप प्रशासक विशेषाधिकारों की आवश्यकता के बिना एक टीसीपी पोर्ट खोलने और सुनने के लिए नियमित सॉकेट फ़ंक्शंस (System.Net.Sockets.TcpListener) का उपयोग करने में सक्षम होना चाहिए। मैं लगभग निश्चित हूं कि स्काइप एक एचटीपी लिस्टर का उपयोग नहीं करता है।

+1

दिलचस्प - मुझे लगता है कि यह सबसे अच्छी योजना है। मैं HTTP अनुरोधों को संसाधित कर रहा हूं, इसलिए एचटीपी लिस्टनर को छोड़ना मुश्किल है, लेकिन मुझे लगता है कि यह सबसे अच्छा विचार है। दो लिंक जो मुझे अब तक मिले हैं इससे मदद मिल सकती है: http://is.gd/3wuX http://is.gd/3wv2 –

2

XP में, आपको पोर्ट को पहले खोलने के लिए कमांड लाइन (httpcfg) का उपयोग करना था, अन्यथा यह गैर-व्यवस्थापक के लिए काम नहीं करेगा।

here देखें - पृष्ठ इस मुद्दे को बताता है, और इसे प्रयोग करने योग्य बनाने के लिए नीचे zip है।

62

जबकि आप सामान्य टीसीपी/आईपी (यह अपेक्षाकृत सरल) का उपयोग करके अपना स्वयं का HTTP सर्वर लिख सकते हैं, तो एचटीपी लिस्टनर का उपयोग करना आसान है, जो Windows XP SP2 में HTTP.SYS कार्यक्षमता का लाभ उठाता है।

हालांकि, HTTP.SYS यूआरएल एसीएल की अवधारणा को जोड़ता है। यह आंशिक रूप से है क्योंकि HTTP.SYS आपको पोर्ट 80 पर उप-नेमस्पेस से जुड़ने की अनुमति देता है। टीसीपी/आईपी का उपयोग सीधे इस आवश्यकता से बचाता है, लेकिन इसका मतलब है कि आप पहले से उपयोग में आने वाले बंदरगाह से नहीं जुड़ सकते हैं।

विंडोज एक्सपी पर, आप एक यूआरएल एसीएल सेट अप करने के लिए HttpCfg.exe प्रोग्राम का उपयोग कर सकते हैं ताकि आपके उपयोगकर्ता खाते को किसी विशेष यूआरएल से जुड़ने का अधिकार दिया जा सके। यह प्लेटफार्म एसडीके नमूने में है।

Windows Vista पर, HTTPCFG अभी भी समर्थित है, लेकिन कार्यक्षमता netsh में समाहित कर दिया गया है

netsh http show urlacl 

... मौजूदा यूआरएल एसीएल की एक सूची दिखाई देगा। एससीडीएल में एसीएल व्यक्त किए जाते हैं।

netsh http add urlacl url=http://+:80/MyUri user=DOMAIN\User listen=yes 

... MyURI नेमस्पेस को कॉन्फ़िगर करेगा ताकि DOMAIN \ उपयोगकर्ता अनुरोधों को सुन सके।

+19

वाह। आप अपनी पोस्ट में एक शब्द को संपादित करने के लिए 4 महीने बाद वापस आए? प्रभावशाली, महोदय :) –

22

यदि आपको केवल अपने कंप्यूटर से (आमतौर पर परीक्षण उद्देश्यों के लिए) अनुरोधों को संभालने की आवश्यकता है, तो आप उपसर्ग में * स्थानीयहोस्ट लिख सकते हैं।

उदाहरण के लिए, "http: // *: 9669 /" के बजाय आप "http: // localhost: 9669 /" लिख सकते हैं। यह HttpListener के साथ ठीक काम करता है और प्रशासनिक विशेषाधिकारों की आवश्यकता नहीं है (कम से कम विंडोज 7 पर)।

+1

मुझे मिला यह उत्तर तीन साल बाद उपयोगी है। यदि आपको 'एक्सेस अस्वीकार कर दिया गया है' संदेश के साथ 'HttpListenerException' मिलता है, तो पोर्ट पहले से ही किसी अन्य प्रक्रिया द्वारा उपयोग में हो सकता है। –

+0

यहां सर्विसहोस्ट का उपयोग कर विंडोज 10 में मैं इसकी पुष्टि नहीं कर सकता। एक विशिष्ट आईपी के साथ बेसड्रेस सेट करते समय, नेटस्टैट में मैं देख सकता हूं कि यह 0.0.0.0 तक बाध्य होगा, इस प्रकार ऊंचे विशेषाधिकारों की आवश्यकता है। –

7

खैर मुझे कुछ इसी तरह से निपटना पड़ा। मेरा कंप्यूटर एक प्रतिबंधित डोमेन में है, इसलिए मेरे पास व्यवस्थापकीय विशेषाधिकार नहीं हैं। कुछ शोध और पढ़ने के बाद मुझे यह धागा मिला और नेटस् संकेतों ने मुझे परीक्षणों के विकास के लिए अस्थायी एसीएल बाइंडिंग का उपयोग किया। मेरे कंप्यूटर पर ये नियम मौजूद है।

वहाँ

इस प्रविष्टि है:

भागो 'netsh http शो urlacl' (जैसा कि ऊपर दिखाया)

[...] 
     Reservierte URL   : http://+:80/Temporary_Listen_Addresses/ 
      Benutzer: \Jeder 
       Abhören: Yes 
       Delegieren: No 
       SDDL: D:(A;;GX;;;WD) 
    [...] 

तो मैं HttpListener गैर-व्यवस्थापक (Jeder) के रूप में उपयोग कर सकते हैं:

[...] 
    HttpListener l = new HttpListener(); 
    string prefix = "http://+:80/Temporary_Listen_Addresses/"; 
    l.Prefixes.Add(prefix); 
    l.Start(); // does not throw any "Permission Denied/Access Denied/Zugriff verweigert" 
    [...] 

इससे कोई भी इस धागे को ढूंढने में मदद करता है।

+0

ग्रेट मिल! मुझे लगता है कि इस [उत्तर] पर @ Don01001100 की टिप्पणी (http://stackoverflow.com/questions/169904/can-i-listen-on-a-port-using-httplistener-or-other-net-code-on- विस्टा-बिना/5408458 # 5408458) इस उत्तर से संबंधित है। तो पोर्ट 80 का उपयोग करके एक और एप्लिकेशन (जैसे आईआईएस, अपाचे, स्काइप, ...) पर विचार करें यदि आपको "एक्सेस अस्वीकार कर दिया गया है" - संदेश। – ischas

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

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