Azure辅助角色 - HttpListener - 错误503.该服务不可用

时间:2015-12-30 11:23:16

标签: azure azure-worker-roles azure-cloud-services httplistener

我在Azure上开发了一个辅助角色。在使用SignalR的目标中,它正在使用OWIN在端口8080上启动Web应用程序。这非常有效。

现在,我需要创建一个HTTP侦听器来侦听端口27045上的传入POST请求。

我做了以下操作来创建和运行HttpListener对象:

var endpoint = RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["listenerendpoint"];
var port = endpoint.IPEndpoint.Port.ToString();   

var listener = new HttpListener();

listener.Prefixes.Add("http://*:" + port + "/");
listener.Start();

现在,在worker角色的Run方法中:

IAsyncResult listenerResult = null;

while (true)
{
    if (listenerResult == null || listenerResult.IsCompleted)
            listenerResult = listener.BeginGetContext(new AsyncCallback(ListenerCallback), listener);

    Thread.Sleep(1000);
}

这是ListenerCallback方法:

public static void ListenerCallback(IAsyncResult result)
{
    var listener = (HttpListener)result.AsyncState;
    var context = listener.EndGetContext(result);

    var request = context.Request;

    var reader = new StreamReader(request.InputStream);

    var payload = reader.ReadToEnd();
}

我在ServiceDefinition.csdef文件中为我的侦听器设置了端点,如下所示:

<WorkerRole name="myworkerrole" vmsize="Standard_D1_v2">
    <ConfigurationSettings>
      <Setting name="Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString" />
    </ConfigurationSettings>
    <Endpoints>
      <InputEndpoint name="mainendpoint" protocol="http" port="8080" localPort="8080" />
      <InputEndpoint name="listenerendpoint" protocol="http" port="27045" localPort="27045" />
    </Endpoints>
    <Runtime executionContext="elevated" />
</WorkerRole>

最后,这是我开发的AJAX测试客户端:

$.ajax({
  method: "POST",
  url: "http://myworkerrolename.cloudapp.net:27045/",
  data: "testdata",
  crossDomain: true,
  dataType: "jsonp"
}).done(function(msg) {
    console.log('done');
    console.log(msg);
}).fail(function(msg) {
    console.log('fail');
    console.log(msg);
});

当我使用Azure Compute Emulator在本地运行辅助角色时,一切都运行良好,我能够向端点发送一个post请求。但是当我在云中部署时,我总是得到相同的AJAX错误:

readyState: 4
status: 404
statusText: error

如果我打开浏览器并尝试访问AJAX客户端配置中提供的URL,则会出现以下错误: HTTP错误503.该服务不可用。

我已经在创建HttpListener时设置了try/catch但它永远不会进入catch块。一切似乎运行良好,但错误仍然存​​在。

由于

2 个答案:

答案 0 :(得分:0)

我建议将完整的前缀添加到您的监听器

所以你可以保留:

 listener.Prefixes.Add("http://*:" + port + "/");

但也加上:

 listener.Prefixes.Add("http://yourapp.cloudapp.net:" + port + "/");

希望这会有所帮助 最好的祝福 斯特凡

答案 1 :(得分:0)

您设置前缀的方式对我不起作用,但您可以将整个前缀保留在RoleEntrypoint上,以便将其提供给您。

这会将httpListener绑定到实例专用IP地址。

这种方法适用于我在Azure中进行模拟和运行。

E.g。

var prefix = endpoint.IPEndpoint.ToString();
listener.Prefixes.Add(&#34; http://&#34; +前缀+&#34; /&#34;);

/的Mikkel