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.