我正在尝试使用新的 Microsoft.AspNet.WebApi.SelfHost NuGet 包在 Azure 辅助角色上托管 ASP.NET WebApi 端点。我的工作人员的 Run() 代码大致如下所示:
// Endpoint is defined as in ServiceDefinition.csdef as
// HTTP, external port 8080, internal port 8080 (or 8081 - error both ways)
RoleInstanceEndpoint externalEndPoint =
RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["Endpoint"];
string baseAddress= String.Format("http://{0}", externalEndPoint.IPEndpoint);
var maxsize = 1024 * 1024;
var config = new HttpSelfHostConfiguration(baseAddress)
{
MaxBufferSize = maxsize, MaxReceivedMessageSize = maxsize
};
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
// Create and open the server
var server = new HttpSelfHostServer(config);
server.OpenAsync().Wait();
// keep the worker thread alive
while (true)
Thread.Sleep(Timeout);
这在开发结构中运行良好,但是在部署到 Azure 时,我从 server.OpenAsync() 调用中获得了 AggregateException,其中包含以下异常堆栈:
[0] One or more errors occurred.
[1] HTTP could not register URL http://+:8081/. Your process does not have access rights to this namespace (see http://go.microsoft.com/fwlink/?LinkId=70353 for details).
[2] Access is denied
我只是在扮演一个普通的工人角色,这似乎是自我主机的“你好世界”......
我的 ServiceDefinition.csdef 的端点部分如下所示:
<Endpoints>
<InputEndpoint name="Endpoint" protocol="http" port="8080" localPort="8081" />
</Endpoints>
我从 RoleEnvironment InstanceEndpoint 获得的 baseAddress 看起来合法 - http://10.115.[X].[Y]:8081
无论我使用相同的端口/本地端口(8080)还是进行映射时,我都会看到失败,就像上面一样。
很明显,可以以这种方式在辅助角色中托管传统的 WCF 服务 - 为什么 ASP.NET WebApi SelfHost 在这种配置中不起作用?