我正在 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 计算模拟器在本地运行辅助角色时,一切正常,我能够向端点发送发布请求。但是当我在云中部署时,我总是收到相同的 AJAX 错误:
readyState: 4
status: 404
statusText: error
如果我打开浏览器并尝试访问 AJAX 客户端配置中提供的 URL,则会出现以下错误:HTTP 错误 503。服务不可用。
我在 HttpListener 创建时设置了 try/catch
,但它永远不会进入 catch
block 。一切似乎运行良好,但错误仍然存在。
谢谢
最佳答案
我建议将完整的前缀添加到您的监听器
所以你可以保留:
listener.Prefixes.Add("http://*:" + port + "/");
但还要添加:
listener.Prefixes.Add("http://yourapp.cloudapp.net:" + port + "/");
希望这有帮助 此致 史蒂芬
关于Azure 辅助角色 - HttpListener - 错误 503。服务不可用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34528550/