我正在使用Visual Studio 2013将WorkerRole发布到Azure。 WorkerRole应该在端口80上绑定,并启动一个Owin WebApp:
WebApp.Start<Startup>(new StartOptions(url: baseUri));
如果我在Azure模拟器上本地运行它,一切都有效,但是当我在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-ing到实例并添加了ACL规则,这些规则是本地计算机上常见的错误来源
netsh http add urlacl url=http://+:80/ user=Everyone
但未成功,它仍然会出现相同的错误。
有没有人遇到过这个问题并且可以指出我正确的解决方向?
谢谢!
答案 0 :(得分:2)
首先,使用带有80绑定的WorkerRole是奇怪的,而80端口可用的WebRole打开了。
下一步。您似乎尚未为WorkerRole定义输入端点,Azure防火墙会关闭所有端口。因此,要打开80端口,请尝试在ServiceDefinition.csdef
文件或WorkerRole属性窗口中指定输入端点,&#34;端点&#34;标签。在发布到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
希望它有所帮助!
答案 1 :(得分:2)
事实证明我绑定了&#34; *:80&#34;而不是从配置中正确获取URI。因此,为Azure Worker绑定baseUri的正确方法是:
var endpoint = RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["Endpoint1"];
string baseUri = String.Format("{0}://{1}", endpoint.Protocol, endpoint.IPEndpoint);
然后绑定:
WebApp.Start<Startup>(new StartOptions(url: baseUri));