ASP.NET应用程序是否有任何方法能够在通过反向代理/网关的请求上下文中,在知道自己的路由的情况下派生其url路径和主机名?
当通过网关请求此url时:
http://conoso.com/behind/some/reverseproxy/api/values/
网关正在将请求重新路由到其他位置:
http://10.0.0.0/api/values
它正在使用DefaultApi路由访问以下ApiController ValuesController的Get方法:
// GET api/values
public HttpResponseMessage Get()
{
var res = Request.CreateResponse();
res.Headers.Add(
"Location",
Url.Link(
"DefaultApi",
new
{
id = 1
}));
return res;
}
它返回以下标题值:
Location: http://10.0.0.0/api/values/1
而我希望发送的有效路径:
Location: http://conoso.com/behind/some/reverseproxy/api/values/1
在框架中使用内置方法的另一种选择是手动格式化字符串:
var baseUrl = "http://conoso.com/behind/some/reverseproxy";
string.Format("{0}/values/1", baseUrl);
但这会散发出一些邪恶的代码气味。有人能建议一种更清洁的方法吗?
我们在安全入口服务器后面也遇到了同样的问题。对于REST调用,我们希望在服务器端生成url,使其在java脚本中可用。但它们不包括安全入口服务器添加的子路径。
所以我们想出了一个类似的解决方法(在布局页面中呈现):
<a id="urlBase" href="/" style="display: none;"></a>
<script type="text/javascript">
baseUrl = document.getElementById('urlBase').getAttribute('href');
</script>
href="/"
已经被入口服务器用href="/path/"
代替,并且在访问REST服务时,我们可以很容易地将baseUrl
与我们的相对路径连接起来。
希望这对你的情况也有帮助。
(我在这里发布了相同的答案,希望可以复制粘贴)