[Windows Azure][Web API] 部署 ASP.NET Web API Self-hosting 的服务到 Windows Azure 的注意事项

ASP.NET Web API Self-hosting 是一个很棒的服务挂载机制,它可以不用依赖 IIS 就能使用 Web API 的功能,简单的说我们可以省下其他 IIS 的功能,直接运用 Web API 提供服务,可说是适合轻量化的 Web API 服务的选择...


ASP.NET Web API Self-hosting 是一个很棒的服务挂载机制,它可以不用依赖 IIS 就能使用 Web API 的功能,简单的说我们可以省下其他 IIS 的功能,直接运用 Web API 提供服务,可说是适合轻量化的 Web API 服务的选择。

若是想要在 Windows Azure Platform 上使用 Self-hosting 的轻量化服务,最好的选择就是 Worker Role,将所有的资源保留给 Web API Self-hosting 服务使用,不过 Web API Self-hosting 会自动要求修改系统的通讯端口,因为我们会使用这个命令来开放通讯端口:

this._hostingServer = new HttpSelfHostServer(this._hostingConfiguration);
this._hostingServer.Configuration.Formatters.Add(new MediaTypeFormatters.MultipartFormDataMediaTypeFormatter());

this._hostingServer.Configuration.Services.Replace(
    typeof(IHttpControllerSelector),
    new ServiceHostingHttpServiceSelector(this._hostingConfiguration));

this._hostingServer.OpenAsync().Wait();

当使用 OpenAsync() 时,会向操作系统要求取得通讯端口来聆听,这时应用程序必须具有存取系统资讯的权限,若没有存取系统权限的话,会在 OpenAsync() 时掷出 System.AggregateException,在 Windows Azure 上则会造成 Role Recycle 的状态,导致部署失败。

要避免这个问题,请在 ServiceDefinition.csdef 中手动加入提升权限的命令:



  
    
    ...
  

这样就可以在 Worker Role 上顺利执行 Web API Self-hosting 的挂载进程了。

另外,请注意要在服务设定中开放 HTTP Port 80 (或是 self-hosting 时要用到的通讯端口),否则就算挂载成功了,外界可能也无法存取。

Reference:

http://stackoverflow.com/questions/11239890/asp-net-webapi-selfhost-service-fails-on-http-url-registration