Substituir host de links webapi odata

Estou usando o WebAPI 2.2 e o Microsoft.AspNet.OData 5.7.0 para criar um serviço OData que ofereça suporte a paginação.

Quando hospedada no ambiente de produção, a WebAPI vive em um servidor que não é exposto externamente; portanto, os vários links retornados na resposta OData, como o@odata.context e@odata.nextLink aponte para o endereço IP interno, por exemplohttp://192.168.X.X/<AccountName>/api/... etc.

Consegui modificar oRequest.ODataProperties().NextLink implementando alguma lógica em cada método ODataController para substituir a URL interna por uma URL externa comohttps://account-name.domain.com/api/..., mas isso é muito inconveniente e corrige apenas os NextLinks.

Existe alguma maneira de definir um nome de host externo no momento da configuração do serviço OData? Eu vi uma propriedadeRequest.ODataProperties().Path e me pergunto se é possível definir um caminho base noconfig.MapODataServiceRoute("odata", "odata", GetModel()); chamada ou noGetModel() implementação usando, por exemplo, oODataConventionModelBuilder?

ATUALIZAR: A melhor solução que encontrei até agora é criar umBaseODataController que substitui oInitialize método e verifica se oRequest.RequestUri.Host.StartsWith("beginning-of-known-internal-IP-address") e, em seguida, reescreva um RequestUri da seguinte maneira:

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}");

Isso corrige perfeitamente o@odata.nextLink URLs para todos os controladores, mas por algum motivo o@odata.context URLs ainda recebem oAccountName parte (por exemplo,https://account-name.domain.com/AccountName/api/odata/$ metadata # ControllerName) para que eles ainda não funcionem.

questionAnswers(4)

yourAnswerToTheQuestion