Anular host de enlaces wedapi odata

Estoy usando WebAPI 2.2 y Microsoft.AspNet.OData 5.7.0 para crear un servicio OData que admita paginación.

Cuando se aloja en el entorno de producción, el WebAPI vive en un servidor que no está expuesto externamente, por lo tanto, los diversos enlaces devueltos en la respuesta de OData, como el@odata.context y@odata.nextLink apunte a la dirección IP interna, p.http://192.168.X.X/<AccountName>/api/... etc.

He podido modificar elRequest.ODataProperties().NextLink implementando algo de lógica en todos y cada uno de los métodos de ODataController para reemplazar la URL interna con una URL externa comohttps://account-name.domain.com/api/..., pero esto es muy inconveniente y solo corrige los NextLinks.

¿Hay alguna forma de establecer un nombre de host externo en el momento de la configuración del servicio OData? He visto una propiedadRequest.ODataProperties().Path y me pregunto si es posible establecer una ruta base en elconfig.MapODataServiceRoute("odata", "odata", GetModel()); llamada, o en elGetModel() implementación utilizando, por ejemplo, elODataConventionModelBuilder?

ACTUALIZAR: La mejor solución que he encontrado hasta ahora, es crear unBaseODataController que anula elInitialize método y comprueba si elRequest.RequestUri.Host.StartsWith("beginning-of-known-internal-IP-address") y luego haga una reescritura de RequestUri de esta manera:

var externalAddress = ConfigClient.Get().ExternalAddress;  // e.g. https://account-name.domain.com
var account = ConfigClient.Get().Id;  // e.g. AccountName
var uriToReplace = new Uri(new Uri("http://" + Request.RequestUri.Host), account);
string originalUri = Request.RequestUri.AbsoluteUri;
Request.RequestUri = new Uri(Request.RequestUri.AbsoluteUri.Replace(uriToReplace.AbsoluteUri, externalAddress));
string newUri = Request.RequestUri.AbsoluteUri;
this.GetLogger().Info($"Request URI was rewritten from {originalUri} to {newUri}");

Esto corrige perfectamente el@odata.nextLink URL para todos los controladores, pero por alguna razón el@odata.context Las URL aún obtienen elAccountName parte (p. ej.https://account-name.domain.com/AccountName/api/odata/$ metadata # ControllerName) para que sigan sin funcionar.

Respuestas a la pregunta(4)

Su respuesta a la pregunta