Azure Worker Role - 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