当前位置: 首页 > 编程语言 > C#

不带非标准端口获取原始URL(C#)分享

时间:2023-04-10 23:52:41 C#

不带非标准端口获取原始URL(C#)第一个问题!环境MVC、C#、AppHarbor。问题我正在调用openid提供程序并生成基于域的绝对回调url。在我的本地机器上,如果我点击http://localhost:12345/loginRequest.Url就可以正常工作;//给我`http://localhost:12345/callback`但是,在AppHarbor上,因为他们使用的是非标准端口,即使我在“http://sub.example.com/login”上点击它请求.Url;//给我http://sub.example.com:15232/回调这搞乱了我的回调,因为端口号不在原始源URL中!我尝试了所有这些给我“http://sub.example.com:15232/callback”。另外要明确这不是领域问题,我从DotNetOpenAuth得到的错误消息是“http://sub.example.com:14107/accounts/openidcallback”不在领域“http://*.example.com/”下.我不觉得我被塞满了吗?现在,我要考虑一些骇人听闻的事情,所有这些都不是100%的解决方案,但我已经厌倦了考虑可能是我不想要的简单属性。我也读过这个,但似乎没有一个公认的答案(更多关于路径而不是权威)。所以我把它给你。总结所以,如果我有http://localhost:12345/login,我需要从请求上下文中获取http://localhost:12345/callback。如果我有“http://sub.example.com/login”,无论它在哪个端口上,我都应该得到“http://sub.example.com/callback”。谢谢!(睡觉时间,早上会回答任何问题)这是AppHarbor等负载平衡设置中的常见问题-我们提供了一个示例解决方法。更新:对于许多ASP.NET应用程序,更理想的解决方案可能是将aspnet:UseHostHeaderForRequestUrlappSetting设置为true。我们(AppHarbor)已经看到几个客户在使用WCF应用程序时遇到问题,这就是为什么我们默认不启用它,并针对这些情况推荐上述解决方案。您可以使用AppHarbor的“配置变量”对其进行配置,以在部署时注入应用程序设置。可以在本文中找到更多信息。我最近遇到了一个问题,我将URL与当前URL进行比较,然后突出显示基于此的导航。它在本地工作,但不在生产中。我有http://example.com/path/to/file.aspx作为我的文件,但是在查看该文件并运行Request.Url.ToString()时它会生成https://example.com:81/path/to/file.aspx在生产环境中负载平衡https://example.com:81/path/to/file.aspx。现在我使用Request.Url.AbsolutePath给我/path/to/file.aspx,从而忽略模式、主机名和端口号。当我需要将它与我使用的每个导航项上的URL进行比较时:NewUri(theLink.Href).AbsolutePath我最初的想法是获取referrer变量并检查它是否包含端口,如果包含则使用它,否则不要吨。如果这不是一个选项,因为代理可能会删除引荐来源标头变量,那么您可能需要使用一些客户端脚本来获取位置并将其传回服务器。我猜AppHarbor使用端口转发到IIS服务器,所以即使公共站点在端口80上,IIS将它托管在另一个端口上,所以它无法知道客户端连接到哪个端口。像Stringport=Request.ServerVariables["SERVER_PORT"]=="80"吗?"":":"+Request.ServerVariables["SERVER_PORT"];StringvirtualRoot=Url.Content("~/");destinationUrl=String.Format("http://{0}{1}{2}",Request.ServerVariables["SERVER_NAME"],port+virtualRoot,"/callback");如果使用框架中的UrlBuilder类,那么这个问题就可以轻松解决。在构建器类上,如果将端口设置为-1,端口号将被删除:newUriBuilder("http://sub.example.com:15232/callback"){Port=-1}返回:http:///sub.example.com/callback要在本地计算机上保留端口号,只需检查Request.IsLocal并且不要将-1应用于端口。我会将其包装在扩展方法中以保持其清洁。我看到这是一个旧线程。我在前面有Apache代理的IIS7.5上运行MVC5时遇到这个问题。在服务器外部,我得到“空响应”,因为asp.net应用程序通过自定义端口从apache获取Url。为了使应用程序重定向到不包含“自定义”端口的子路径,请忘记响应/请求对象,并使用Transfer方法。比如我想让用户在没有登录的情况下自动跳转到登录页面:需要了解更多C#学习教程,希望大家多多关注——if(!User.Identity.IsAuthenticated)Server。TransferRequest("账户/登录");本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: