【发布时间】:2013-12-09 20:05:52
【问题描述】:
在通过反向代理/网关的请求的上下文中,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);
但这会散发出一些邪恶的代码气味。有没有人可以建议的更清洁的方法?
【问题讨论】:
-
我假设您使用
Url.Content("~")而不是Url.Link得到类似的结果? -
@C.Barlow 不同,但在 MVC 控制器中,它只返回应用程序内的相对路径,即 /api/values/1 (使用上面的示例)。使用反向代理网关,这将解析到无法正确路由的 url 路径。
-
这里有一些创意......其中一些有点老套,但可能会给你你需要的东西:stackoverflow.com/questions/1288046/…
标签: c# asp.net-mvc asp.net-web-api reverse-proxy urlhelper