Estoy tratando de alojar un punto final ASP.NET WebApi en una función de trabajador de Azure utilizando el nuevo paquete Microsoft.AspNet.WebApi.SelfHost NuGet. Ejecutar código de mi trabajador() se ve más o menos así:ASP.NET WebApi El servicio SelfHost falla en el registro URL HTTP
// 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);
Esto funciona bien en el tejido dev, pero cuando se despliega en Azure, me sale un AggregateException de la llamada server.OpenAsync(), que contiene la siguiente pila de excepción :
[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
sólo estoy corriendo un papel trabajador de vainilla y este parece ser el "hola mundo" de la auto-anfitrión ...
el criterio de valoración parte de mi ServiceDefinition.csdef se ve así:
<Endpoints>
<InputEndpoint name="Endpoint" protocol="http" port="8080" localPort="8081" />
</Endpoints>
El baseAddress que recibo de la RoleEnvironment InstanceEndpoint parece de fiar - http:.. //10.115 [X] [Y]: 8081
veo el fracaso si utilizo el mismo puerto/localPort (8080) o cuando hago un mapeo, como el anterior.
Está claro que es posible alojar un servicio WCF convencional en una función de trabajo de esta manera: ¿hay alguna razón por la cual ASP.NET WebApi SelfHost no funcionaría en esta configuración?
Hola Ryan, muchas gracias! Pensé que era un problema de permisos. # 1 es un martillo bastante grande ... Lo haré si fuera necesario, pero esperaba hacer algo un poco más quirúrgico ... como ejecutar netsh en un guion de inicio elevado, algo así como "netsh.exe http add" urlacl url = "http: // +: 8080" pero necesito otorgar permiso a un usuario, y realmente no sé el nombre/SID de la cuenta en la que Azure ejecutará el rol de trabajador ... ¿hay alguna forma de averiguarlo, o ejecutar netsh.exe de una manera que permita el acceso en ese puerto a todos los usuarios? –
Hmm ... ahora que miro más de cerca, creo que es porque estás haciendo una reserva de comodín. Solo actualicé el código para apuntar a la dirección IP y el puerto exactos, creo que puede evitar el problema de permisos. IIRC, solo son las reservas de comodines las que deben elevarse a ACL. Consulte la respuesta actualizada. – dunnry
Cuando trace el valor de " baseAddress "en el código anterior, sale así: http://10.115.210.79:8080. Así que en realidad estoy usando una coincidencia exacta ... además, lo extraño es que incluso si agrego una línea al script de inicio que hace "netsh.exe http add urlacl url =" http: // +: 8080 "user = everyone", y verifica que se ejecuta correctamente (y que los permisos son correctos cuando Hago un "netsh http urlacl show"), I * STILL * obtengo el mismo error. –