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.