我正在使用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}");
Run Code Online (Sandbox Code Playgroud)
这可以完美地修复@odata.nextLink所有控制器的URL,但是由于某些原因, …