新しい 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
同じポート/localPort (8080) を使用しているか、上記のようにマッピングを行っているかにかかわらず、エラーが発生します。
このように従来の WCF サービスをワーカー ロールでホストできることは明らかです。ASP.NET WebApi SelfHost がこの構成で機能しない理由はありますか?