2012-06-28 19 views
7

पर विफल हो जाती है, मैं नए माइक्रोसॉफ्ट.एस्पनेट.एबएपीआई। सेलहोस्ट नुगेट पैकेज का उपयोग करके एक एज़ूर वर्कर भूमिका पर एएसपी.NET वेबएपी एंडपॉइंट होस्ट करने की कोशिश कर रहा हूं। मेरे कार्यकर्ता रन() कोड इस तरह मोटे तौर पर दिखता है:एएसपी.नेट वेबएपी सेल्फहोस्ट सेवा HTTP यूआरएल पंजीकरण

// Endpoint is defined as in ServiceDefinition.csdef as 
// HTTP, external port 8080, internal port 8080 (or 8081 - error both ways) 
RoleInstanceEndpoint externalEndPoint = 
    RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["Endpoint"]; 
string baseAddress= String.Format("http://{0}", externalEndPoint.IPEndpoint); 
var maxsize = 1024 * 1024; 
var config = new HttpSelfHostConfiguration(baseAddress) 
{ 
    MaxBufferSize = maxsize, MaxReceivedMessageSize = maxsize 
}; 
config.Routes.MapHttpRoute(
    name: "DefaultApi", 
    routeTemplate: "api/{controller}/{id}", 
    defaults: new { id = RouteParameter.Optional } 
); 

// Create and open the server 
var server = new HttpSelfHostServer(config); 
server.OpenAsync().Wait(); 

// keep the worker thread alive 
while (true) 
    Thread.Sleep(Timeout); 

यह देव कपड़े में ठीक काम करता है, लेकिन जब Azure करने के लिए की तैनाती, मैं server.OpenAsync() कॉल से एक AggregateException मिल निम्न अपवादों के ढेर से युक्त :

[0] One or more errors occurred. 
[1] HTTP could not register URL http://+:8081/. Your process does not have access rights to this namespace (see http://go.microsoft.com/fwlink/?LinkId=70353 for details). 
[2] Access is denied 

मैं सिर्फ एक वेनिला कार्यकर्ता भूमिका चल रहा हूँ और इस आत्म मेजबान के "हैलो दुनिया" हो रहा है ... मेरी ServiceDefinition.csdef की

endpoint हिस्सा इस तरह दिखता है:

<Endpoints> 
    <InputEndpoint name="Endpoint" protocol="http" port="8080" localPort="8081" /> 
</Endpoints> 

baseAddress कि मैं RoleEnvironment InstanceEndpoint से प्राप्त कानूनी लग रहा है - http:।। //10.115 [X] [Y]: 8081

मैं विफलता देखते हैं कि क्या मैं एक ही बंदरगाह/localPort (8080 का उपयोग) या जब मैं उपरोक्त की तरह मैपिंग करता हूं।

यह स्पष्ट है कि इस तरह से एक कार्यकर्ता भूमिका में पारंपरिक डब्ल्यूसीएफ सेवा की मेजबानी करना संभव है - क्या कोई कारण है कि एएसपी.नेट वेबएपी सेल्फहोस्ट इस कॉन्फ़िगरेशन में काम नहीं करेगा?

उत्तर

4

डिफ़ॉल्ट रूप से, रोलएन्ट्रीपॉइंट सुरक्षा के लिए बहुत ही कम अनुमति उपयोगकर्ता खाते के तहत चलता है। चूंकि त्रुटि इंगित करती है, यह उन अनुमतियों के कारण उस पोर्ट को आरक्षित करने में असमर्थ है। अपनी भूमिका परिभाषा (अर्थात <Runtime executionContext="elevated"/>) के क्रम तत्व जोड़कर

  1. प्रणाली के रूप में कार्यकर्ता प्रक्रिया चलाएँ: आप यहाँ दो विकल्प हैं।
  2. एक स्टार्टअप स्क्रिप्ट बनाएं जो आपके लिए बंदरगाह को ऊंचा और सुरक्षित रखे।

आसपास खेलने के लिए (और समस्या निवारण अगर यह एक समस्या मुद्दा है), # 1 कर यह परीक्षण करने का एक त्वरित तरीका है।

संपादित करें: मुझे वाइल्डकार्ड आरक्षण करते समय डब्ल्यूसीएफ और विंडोज़ एज़ूर के साथ एक अनुमति समस्या याद है। पूर्ण होस्टनाम का उपयोग करते समय यह ठीक काम करता था उदा।

host.AddServiceEndpoint(
typeof(IEchoService), new BasicHttpBinding(BasicHttpSecurityMode.None) { HostNameComparisonMode = HostNameComparisonMode.Exact }, "echo"); 
+1

हे रयान - बहुत धन्यवाद! मुझे लगा कि यह कुछ अनुमति देने वाला मुद्दा था। # 1 एक बहुत बड़ा हथौड़ा है ... अगर मुझे करने की ज़रूरत है तो मैं इसे करूँगा, लेकिन मैं कुछ और सर्जिकल करने की उम्मीद कर रहा था ... जैसे कि एक उन्नत स्टार्टअप स्क्रिप्ट में नेट नेट्स चलाएं - जैसे "netsh.exe http add urlacl url = "http: // +: 8080" लेकिन मुझे किसी उपयोगकर्ता को अनुमति देने की आवश्यकता है, और मुझे वास्तव में उस खाते का नाम/एसआईडी नहीं पता है जो Azure कार्यकर्ता भूमिका निभाएगा ... क्या कोई है इसे खोजने का तरीका, या netsh.exe को ऐसे तरीके से चलाने के लिए जो सभी उपयोगकर्ताओं को उस पोर्ट पर पहुंच की इजाजत देता है? –

+0

हम्म ... अब जब मैं नज़दीक दिखता हूं, मुझे लगता है कि ऐसा इसलिए है क्योंकि आप वाइल्डकार्ड आरक्षण कर रहे हैं। अगर आप सटीक आईपी पते और बंदरगाह को लक्षित करने के लिए बस कोड को अपडेट किया गया, मुझे लगता है कि आप अनुमति की समस्या के आसपास हो सकते हैं। आईआईआरसी, यह केवल वाइल्डकार्ड आरक्षण है जिसे एसीएल तक बढ़ाया जाना चाहिए। अद्यतन उत्तर देखें – dunnry

+0

जब मैं " baseAddress "उपरोक्त कोड में, यह इस तरह से बाहर आता है: http://10.115.210.79:8080। तो मैं वास्तव में एक सटीक मिलान का उपयोग कर रहा हूं ... इसके अलावा, अजीब चीज है कि अगर मैं स्टार्टअप स्क्रिप्ट में एक पंक्ति जोड़ता हूं जो "netsh.exe http urlacl url =" http: // +: 8080 "उपयोगकर्ता = हर कोई" करता है, और सत्यापित करता है कि यह सही तरीके से निष्पादित करता है (और अनुमतियां सही होती हैं मैं एक "नेटस् http httplll शो" करता हूं), मैं * अभी भी एक ही त्रुटि प्राप्त करता हूं। –

2

आधे से एक देव दिन कोई लाभ नहीं हुआ एक ऊंचा स्टार्टअप स्क्रिप्ट से Netsh.exe लागू के साथ प्रयोग करने के बाद, मैं छोड़ दिया और बड़ा हथौड़ा का उपयोग कर समाप्त हो गया और पूरे कार्यकर्ता भूमिका ऊंचा चलाने का रयान की प्रारंभिक सुझाव लेने :

<WorkerRole name="WorkerRole" vmsize="ExtraSmall"> 
    <Runtime executionContext="elevated"> 
    </Runtime> 
</WorkerRole> 

जो सभी मुद्दों को हल करता है।

संदर्भ के लिए, यहाँ है कि कैसे मैं गैर उठाया उपयोगकर्ता खातों के लिए HTTP पंजीकरण (जो वास्तव में काम नहीं) की अनुमति के लिए करने की कोशिश की:

ServiceDefinition.csdef में:

<Startup> 
    <Task executionContext="elevated" commandLine="startup\Install.cmd"> 
    <Environment> 
     <Variable name="ENDPOINTPORT "> 
     <RoleInstanceValue xpath="/RoleEnvironment/CurrentInstance/Endpoints/Endpoint[@name='Endpoint']/@port" /> 
     </Variable> 
    </Environment> 
    </Task> 
</Startup> 
<Endpoints> 
    <InputEndpoint name="Endpoint" protocol="http" port="8080" localPort="8080" /> 
</Endpoints> 

और स्टार्टअप स्क्रिप्ट में (स्टार्टअप \ स्थापित करें।मेरे मामले में cmd):

netsh.exe http add urlacl url=http://+:%ENDPOINTPORT%/api user=everyone listen=yes delegate=yes 

यह मूलतः समाधान है कि अच्छा AspNetWebApi (बस क्या वे here की सिफारिश कर रही है) की एक छोटी तरीके पर काम कर लोगों की सिफारिश की थी है, लेकिन दुर्भाग्य से यह मेरे लिए काम नहीं किया - जबकि नेटस् कमांड सफलतापूर्वक निष्पादित किया गया था और मैं यह सत्यापित करने में सक्षम था कि यूआरएल पर urlacl मैं स्वयं को होस्ट कर रहा हूं (http: // +: 8080/api /) \ Non द्वारा अनुमति है, मुझे अभी भी वही अनुमति मिल रही है त्रुटि। यदि कोई व्यक्ति कार्यकर्ता भूमिका निभाते समय यह काम कैसे करता है, तो कृपया पोस्ट करें!

+0

मैंने सीएमडी में एक बार स्क्रिप्ट चलाई, लेकिन मुझे व्यवस्थापक के रूप में भागना पड़ा: आप अपनी स्टार्टअप स्क्रिप्ट किसके रूप में चलाते हैं? एक अन्य रेफरी [यहां] (http://www.asp.net/web-api/overview/hosting-aspnet-web-api/self-host-a-web-api) – Benjol

+0

डिफ़ॉल्ट रूप से Azure इसकी भूमिका नहीं चलाता है ऊंचे खाते, लेकिन काफी प्रतिबंधित उपयोगकर्ता खातों में जिनके पास अनुमानित नाम नहीं हैं (वे GUID हैं जो कपड़े नियंत्रक वीएम को प्रीप करते समय बनाए जाते हैं)। Azure एक उन्नत (व्यवस्थापक) खाते में स्टार्टअप स्क्रिप्ट चलाने की अनुमति देता है - जो कि <कार्य निष्पादन कॉन्टेक्स्ट = "उन्नत" ...> मेरे कोड में करता है। लेकिन किसी कारण से netsh.exe अभी भी कमांड को अनुमति देने में सफल नहीं हुआ। मैं उस पूरी भूमिका को चलाने के लिए समाप्त हुआ (जो मुद्दों को हल करता है)। –

+0

ओह, क्षमा करें, मैं 'Azure' विवरण पर छोड़ दिया! – Benjol

-1

अपनी परियोजना में 'system.ServiceModel' संदर्भ जोड़ें और 'config.HostNameComparisonMode = System.ServiceModel.HostNameComparisonMode.Exact;' आपको व्यवस्थापक विशेषाधिकार अपवाद नहीं मिलता है (पहुंच अस्वीकृत)।

+2

कृपया एक छोटी टिप्पणी कृपया? – Zulu

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