【问题标题】:Azure Worker Role - HttpListener - Error 503. The service is unavailableAzure 辅助角色 - HttpListener - 错误 503。服务不可用
【发布时间】:2016-04-04 08:53:33
【问题描述】:

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

现在,我需要创建一个 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();

现在,在工作角色的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 在本地运行辅助角色时,一切正常,我可以向端点发送发布请求。但是当我在云端部署时,我总是遇到同样的 AJAX 错误:

readyState: 4
status: 404
statusText: error

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

我在创建 HttpListener 时设置了 try/catch,但它从未在 catch 块上继续。一切似乎运行良好,但错误仍然存​​在。

谢谢

【问题讨论】:

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


    【解决方案1】:

    我建议为您的听众添加完整的前缀

    所以你可以保留:

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

    但还要添加:

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

    希望这会有所帮助 最好的祝福 斯蒂芬

    【讨论】:

      【解决方案2】:

      你设置前缀的方式对我不起作用,但你可以将整个前缀留给 RoleEntrypoint 给你。

      这会将 httpListener 绑定到实例私有 IP 地址。

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

      例如

      var 前缀 = 端点.IPEndpoint.ToString();
      listener.Prefixes.Add("http://" + prefix + "/");

      /米克尔

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-09-19
        • 1970-01-01
        • 1970-01-01
        • 2015-07-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多