Переопределить хост ссылок на одапа вебапи
Я использую WebAPI 2.2 и Microsoft.AspNet.OData 5.7.0 для создания службы OData, которая поддерживает подкачку страниц.
При размещении в производственной среде WebAPI живет на сервере, который не предоставляется извне, поэтому различные ответы, возвращаемые в ответе OData, такие как@odata.context
а также@odata.nextLink
указать внутренний IP-адрес, напримерhttp://192.168.X.X/<AccountName>/api/...
и т.п.
Я был в состоянии изменитьRequest.ODataProperties().NextLink
реализуя некоторую логику в каждом методе ODataController, чтобы заменить внутренний URL-адрес внешним URL-адресом, напримерhttps://account-name.domain.com/api/...
, но это очень неудобно, и это только исправляет NextLinks.
Есть ли способ установить имя внешнего хоста во время настройки службы OData? Я видел собственностьRequest.ODataProperties().Path
и задаюсь вопросом, возможно ли установить базовый путь наconfig.MapODataServiceRoute("odata", "odata", GetModel());
позвонить или вGetModel()
реализация с использованием, например,ODataConventionModelBuilder
?
ОБНОВИТЬ: Лучшее решение, которое я придумала, это создатьBaseODataController
который отменяетInitialize
метод и проверяет, является лиRequest.RequestUri.Host.StartsWith("beginning-of-known-internal-IP-address")
а затем сделать RequestUri переписать так:
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}");
Это прекрасно исправляет@odata.nextLink
URL для всех контроллеров, но по какой-то причине@odata.context
URL все еще получаютAccountName
часть (например,https://account-name.domain.com/AccountName/api/odata/$ metadata # ControllerName), поэтому они все еще не работают.