Переопределить хост ссылок на одапа вебапи

Я использую 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), поэтому они все еще не работают.

Ответы на вопрос(4)

Ваш ответ на вопрос