2015-05-28 12 views
1

Я использую Visual Studio 2013 для публикации WorkerRole to Azure. WorkerRole должен связать порт 80, и начать Owin WebAPP:Azure Cloud Service - доступ запрещен (привязка к порту)

WebApp.Start<Startup>(new StartOptions(url: baseUri)); 

Все работает, если я запустить его локально на Лазурном Emulator, но когда я запускаю его в прямом эфире на Azure он терпит неудачу. Соответствующее Исключение:

Inner Exception: Access is denied 
    at System.Net.HttpListener.AddAllPrefixes() 
    at System.Net.HttpListener.Start() 
    at Microsoft.Owin.Host.HttpListener.OwinHttpListener.Start(HttpListener listener, Func`2 appFunc, IList`1 addresses, IDictionary`2 capabilities, Func`2 loggerFactory) 
    at Microsoft.Owin.Host.HttpListener.OwinServerFactory.Create(Func`2 app, IDictionary`2 properties) 

Я попытался RDP-кий к экземпляру и добавлению правила ACL, которые были обычным источником таких ошибок на локальной машине

netsh http add urlacl url=http://+:80/ user=Everyone 

, но безуспешно, она все еще дает та же ошибка.

Кто-нибудь встретился с этой проблемой и мог указать мне в правильном направлении для ее решения?

Спасибо!

ответ

1

Оказалось, что я привязывался к «*: 80», вместо того чтобы правильно получить URI из конфигурации. Таким образом, правильный путь, чтобы получить BaseUri связать на Azure для работника является:

var endpoint = RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["Endpoint1"]; 
string baseUri = String.Format("{0}://{1}", endpoint.Protocol, endpoint.IPEndpoint); 

, а затем просто связать:

WebApp.Start<Startup>(new StartOptions(url: baseUri)); 
+0

Это решение сработало и для меня. Спасибо, что поделился! –

1

Прежде всего странно использовать WorkerRole с привязкой 80, в то время как WebRole доступен с открытым портом 80.

Дальше. Кажется, что вы не определили конечную точку ввода для WorkerRole, а брандмауэр Azure закрывает все порты. Поэтому, чтобы открыть порт 80, попробуйте указать конечную точку ввода в вашем файле ServiceDefinition.csdef или в окне свойств WorkerRole на вкладке «Конечные точки». При публикации в Azure он должен подключить эту конфигурацию, чтобы открыть порт.

Так короче попробуйте обновить ServiceDefinition.csdef с этим:

<ServiceDefinition name="MyService" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition"> 
    <WorkerRole name="WorkerRole1">  
    <Endpoints> 
     <InputEndpoint name="HttpIn" protocol="http" port="80" localPort="80" /> 
    </Endpoints> 
    </WorkerRole> 
</ServiceDefinition> 

Также проверьте эти документы: Enable Communication for Role Instances in Azure, WorkerRole Schema, How to Configure Cloud Services

Надеется, что это помогает!

+0

Спасибо за полезные указания. Я забыл упомянуть в своем посте, что я определил конечную точку. Но проблема заключалась в том, чтобы не использовать URI конечной точки для привязки, а скорее отдельную конфигурацию (как описано в моем ответе). – ticcky

+0

Но что вы подразумеваете под «WorkerRole с привязкой 80, когда WebRole доступен с открытым портом 80»? У меня нет WebRole, или есть ли по умолчанию? – ticcky

+0

Я думал, что вы можете использовать WebRole, и он должен открыть 80 портов. – Artyom