Рабочая роль Azure - HttpListener - ошибка 503. Служба недоступна.

Я разрабатываю рабочую роль в Azure. Он использует OWIN для запуска веб-приложения на порту 8080 с целью работы с SignalR. Это прекрасно работает.

Теперь мне нужно создать прослушиватель HTTP для прослушивания входящих запросов POST на порт 27045.

Я сделал следующее, чтобы создать и запустить объект 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

И если я открываю свой браузер и пытаюсь перейти по URL-адресу, указанному в конфигурации клиента AJAX, возникает следующая ошибка: Ошибка HTTP 503. Служба недоступна.

Я установил try/catch при создании HttpListener, но он никогда не попадает в блок catch. Кажется, все работает нормально, но ошибка все еще существует.

Спасибо


person Rotan    schedule 30.12.2015    source источник


Ответы (2)


Я бы посоветовал добавить вашему слушателю полный префикс

Так что вы можете оставить:

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

Но добавьте также:

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

Надеюсь, это поможет С уважением, Стефан

person stephgou    schedule 30.12.2015

То, как вы устанавливаете свой префикс, мне не подходит, но вы можете оставить весь префикс на усмотрение RoleEntrypoint, чтобы передать его вам.

Это свяжет httpListener с частным IP-адресом экземпляра.

Этот подход работает для меня как для эмуляции, так и для работы в Azure.

E.g.

var prefix = endpoint.IPEndpoint.ToString ();
listener.Prefixes.Add ("http: //" + prefix + "/");

/ Миккель

person Mikkel Mørk Hegnhøj    schedule 04.01.2016