ASP.NET中获取当前域的最佳方法是什么?
我想知道什么是获得当前域的最佳方式是在ASP.NET中?ASP.NET中获取当前域的最佳方法是什么?
例如:
http://www.domainname.com/subdir/应该产生http://www.domainname.com http://www.sub.domainname.com/subdir/应该得到http://sub.domainname.com
作为指导,我应该能够添加一个网址,如 “/Folder/Content/filename.html”(发言权由ASP.NET MVC中的Url.RouteUrl()生成)直接到URL,它应该工作。
相同的答案MattMitchell的,但有一些修改。 这会检查默认端口。
Request.Url.Scheme + System.Uri.SchemeDelimiter + Request.Url.Host +
(Request.Url.IsDefaultPort ? "" : ":" + Request.Url.Port)
按照this link一个很好的出发点是:
Request.Url.Scheme + System.Uri.SchemeDelimiter + Request.Url.Host
然而,如果域名是http://www.domainname.com:500这将失败。
类似以下内容是很有诱惑力的解决此问题:
int defaultPort = Request.IsSecureConnection ? 443 : 80;
Request.Url.Scheme + System.Uri.SchemeDelimiter + Request.Url.Host
+ (Request.Url.Port != defaultPort ? ":" + Request.Url.Port : "");
然而,80和443端口将取决于配置。
因此,您应该使用IsDefaultPort
作为上述来自CarlosMuñoz的Accepted Answer。
为什么假设端口80在这里?如果你删除了这个假设,那么代码看起来就像是一窍不通。当您假定端口80时,您将在许多情况下失败(请参阅其他端口上的注释)。如果您希望尽可能删除端口号,则必须检查端口号是相关方案的默认端口号,并且该方案支持默认端口号。 – bzlm 2009-04-29 16:03:55
是的,看到端口80可能是一个坏主意的说明。我不知道任何其他方式,但这就是为什么我提到它需要依赖配置。 – 2009-05-01 03:08:45
我不知道这是否有用,但你也可以尝试:如果Request.IsSecureConnection确定是否使用HTTPS? – 2013-06-12 19:44:05
如何:
String domain = "http://" + Request.Url.Host
不错,但如果您的网站有安全网页,例如https:// 如果您的网域未托管在端口80上,该怎么办? – 2008-09-15 03:16:30
如何:
NameValueCollection vars = HttpContext.Current.Request.ServerVariables;
string protocol = vars["SERVER_PORT_SECURE"] == "1" ? "https://" : "http://";
string domain = vars["SERVER_NAME"];
string port = vars["SERVER_PORT"];
另一种方式:
string domain;
Uri url = HttpContext.Current.Request.Url;
domain= url.AbsoluteUri.Replace(url.PathAndQuery, string.Empty);
警告!给任何人使用Current.Request .Url.Host。了解您正在根据当前请求开展工作,并且当前的请求不会始终与您的服务器在一起,有时可能与其他服务器一起使用。
因此,如果你在Global.asax中的Application_BeginRequest()这样的东西中使用它,那么99.9%的时间会好起来,但是0.1%你可能会获得除你自己的服务器主机名以外的东西。
一个很好的例子是我不久前发现的。我的服务器时常会碰到http://proxyjudge1.proxyfire.net/fastenv。 Application_BeginRequest()很乐意处理这个请求,所以如果你在发出这个请求时调用Request.Url.Host,你会返回proxyjudge1.proxyfire.net。有些人可能会认为“不行”,但值得注意,因为这是一个非常难以察觉的错误,因为它只发生了0.1%的时间:P
这个错误迫使我插入我的域名主机作为一个字符串在配置文件中。
为什么不使用
Request.Url.Authority
它返回整个域和端口。
你仍然需要弄清楚HTTP或
Request.Url.GetLeftPart(UriPartial.Authority)
这包括方案HTTPS。
使用UriBuilder:
var relativePath = ""; // or whatever-path-you-want
var uriBuilder = new UriBuilder
{
Host = Request.Url.Host,
Path = relativePath,
Scheme = Request.Url.Scheme
};
if (!Request.Url.IsDefaultPort)
uriBuilder.Port = Request.Url.Port;
var fullPathToUse = uriBuilder.ToString();
简单和短方式(它支持架构,域和端口):
var MyUri= Request.UrlReferrer;
// Use this like:
Var fullDomain = myUri.Scheme + Uri.SchemeDelimiter + myUri.Authority;
// Example output: https://www.example.com:5031
// Example output: http://www.example.com:5031
// Example output: https://www.example.com
注意 “当前域” 在这里实际上什么是这些用户代理用于访问您的网站,在许多情况下,这与您网站的“官方网址”以及最终用户可能进入浏览器的内容不同(反向代理,转发代理,内部主机名,IP 地址, ...)。 – bzlm 2009-04-29 16:06:03
那么有没有办法得到“官方网址”(来自IIS的一个)? – 2009-05-01 03:02:59