Host von Webapi-ODATA-Links überschreiben

Ich verwende WebAPI 2.2 und Microsoft.AspNet.OData 5.7.0, um einen OData-Dienst zu erstellen, der Paging unterstützt.

Wenn das WebAPI in der Produktionsumgebung gehostet wird, befindet es sich auf einem Server, der nicht extern verfügbar gemacht wird. Daher werden die verschiedenen Links in der OData-Antwort zurückgegeben, @odata.context und@odata.nextLink auf die interne IP-Adresse zeigen, z.http://192.168.X.X/<AccountName>/api/... etc

Ich konnte das @ ändeRequest.ODataProperties().NextLink durch Implementierung von Logik in jeder ODataController-Methode, um die interne URL durch eine externe URL wie @ zu ersetzhttps://account-name.domain.com/api/..., aber das ist sehr unpraktisch und behebt nur die NextLinks.

Kann beim Konfigurieren des OData-Dienstes ein externer Hostname festgelegt werden? Ich habe eine Immobilie gesehenRequest.ODataProperties().Path und frage mich, ob es möglich ist, einen Basispfad am @ festzulegconfig.MapODataServiceRoute("odata", "odata", GetModel()); Anruf oder in derGetModel() Implementierung mit zum Beispiel demODataConventionModelBuilder?

AKTUALISIEREN Die beste Lösung, die ich bisher gefunden habe, ist die Erstellung einesBaseODataController das überschreibt dasInitialize -Methode und prüft, ob dasRequest.RequestUri.Host.StartsWith("beginning-of-known-internal-IP-address") und dann schreibe RequestUri wie folgt um:

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

Dies behebt perfekt das@odata.nextLink URLs für alle Controller, aber aus irgendeinem Grund das@odata.context URLs erhalten weiterhin dasAccountName part (z. B.https: //account-name.domain.com/AccountName/api/odata $ metadata # ControllerName), sodass sie immer noch nicht funktionieren.

Antworten auf die Frage(8)

Ihre Antwort auf die Frage