Я разрабатываю рабочую роль в 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
. Кажется, все работает нормально, но ошибка все еще существует.
Спасибо