【发布时间】:2015-01-21 03:38:17
【问题描述】:
我有一个Controller 操作,其中我:
- 将 URL 转发给第三方,如果操作成功,第三方会将客户端重定向到该第三方。
- 客户端然后连接到第 3 方并执行操作。
- 如果成功,第 3 方会将客户端重定向(使用 302)到我们在第 1 步告诉他们的 URL。
这一切都有效。问题是服务器上的控制器告诉第 3 方我们使用的 URL:
var urlHelper = new UrlHelper(System.Web.HttpContext.Current.Request.RequestContext);
var responseUrl = urlHelper.Action("Action", "Controller", new { id }, Request.Url.Scheme);
responseURL 现在看起来像:
“https://some.internal.domain/App/Action/1234”。
然而,客户使用如下地址访问该站点:
“https://example.com/App/Action/1234”。
他们无法从外部访问https://some.internal.domain。
那么我怎样才能为第 3 方构建绝对 URL 以将客户端重定向到 使用客户端访问站点的 URL?
更新: 上面的方法应该有效,事实证明问题出在反向代理后面(已重新措辞以反映这一点)。
【问题讨论】:
-
UrlHelper.Action不是已经在请求的主机上工作了,如果不这样做的话?我认为您也不必告诉它Request.Url.Scheme。无论如何,Request.Url没有做你想要的事情有什么原因吗? -
我希望 UrlHelper 能够解决该请求,但它似乎没有发生。我告诉它方案来获取我想要的绝对 URL。也许我可以使用 Request.Url 并做我自己的字符串连接来构造 URL,现在尝试......
-
那么它作为主机返回什么?如果不是现在的?那么接下来我会研究
UriBuilder。或者我认为即使是Uri构造函数也可能会发生过载,该构造函数将采用方案 (Request.Url)、主机 (Request.Url) 和路径 (UrlHelper.Action(string, string, object))。这至少比串联要好。 -
不幸的是,这也是给some.internal.domain/App/Action/1234
-
嗯。这会增加一些混乱。似乎您最好的选择是检查标题。我从未使用过那个特定的代理,但大多数代理都会向上游服务器添加一个标头,以告知有关传入请求的一些信息。如果外部请求是唯一通过代理的请求,这将很容易。
标签: c# asp.net-mvc asp.net-mvc-4 .net-4.5