获取没有非标准端口的原始URL(C#)

Dar*_*Teo 18 c# asp.net-mvc port httprequest appharbor

第一个问题!


环境

MVC,C#,AppHarbor.

问题

我正在调用openid提供程序,并根据域生成绝对回调URL.

在我的本地机器上,如果我点击,这可以正常工作 http://localhost:12345/login

Request.Url; //gives me `http://localhost:12345/callback`
Run Code Online (Sandbox Code Playgroud)

但是,在我正在部署的AppHarbor上,因为他们使用的是非标准端口,即使我在" http://sub.example.com/login "上点击它

Request.Url; //gives me http://sub.example.com:15232/callback
Run Code Online (Sandbox Code Playgroud)

这搞砸了我的回调,因为端口号不在原始源URL中!

我试过了

  • Request.Url
  • Request.Url.OriginalString
  • Request.RawUrl

所有这些都给了我" http://sub.example.com:15232/callback ".

另外要清除这不是一个Realm问题,我从DotNetOpenAuth得到的错误信息是

'http://sub.example.com:14107/accounts/openidcallback' not under realm 'http://*.example.com/'. 
Run Code Online (Sandbox Code Playgroud)

我不觉得我塞满了吗?

现在,我要考虑一些像hacky这样的东西

  • 预处理器命令(#IF DEBUG THEN PUT PORT)
  • string replace(Request.URL.Contains("localhost"))

所有这些都不是100%的解决方案,但我厌倦了考虑我可能缺少的一个简单的财产.我也读过这个,但似乎没有一个可接受的答案(更多的是关于路径而不是权威).所以我把它给你们.

摘要

所以如果我有http://localhost:12345/login,我需要http://localhost:12345/callback从Request上下文中获取.

如果我有" http://sub.example.com/login ",我应该得到" http://sub.example.com/callback ",无论它在哪个端口.

谢谢!(睡觉时间,早上会回答任何问题)

run*_*sen 21

这是AppHarbor等负载均衡设置中的常见问题 - 我们提供了一个示例解决方法.

更新:对于许多ASP.NET应用程序来说,更理想的解决方案可能是将aspnet:UseHostHeaderForRequestUrlappSetting 设置为true.我们(AppHarbor)已经看到几个客户在使用WCF应用程序时遇到问题,这就是为什么我们默认情况下没有启用它,并且为这些情况推荐上述解决方案.您可以使用AppHarbor的"配置变量"对其进行配置,以在部署时注入appsettings.可以在本文中找到更多信息.