我想知道获取当前域的最佳方法是在ASP.NET中吗?
例如:
http://www.domainname.com/subdir/应该会产生http://www.domainname.com http://www.sub.domainname.com/subdir/应该产生http://sub.domainname.com
作为指南,我应该可以直接在URL上添加一个像“/Folder/Content/filename.html”这样的URL(比如由ASP.NET MVC中的Url.RouteUrl()生成),它应该可以工作
答案 0 :(得分:178)
与MattMitchell的答案相同,但有一些修改。 这会检查默认端口。
修改:更新语法并按建议使用
Request.Url.Authority
$"{Request.Url.Scheme}{System.Uri.SchemeDelimiter}{Request.Url.Authority}"
答案 1 :(得分:37)
根据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将取决于配置。
因此,您应该使用上面Accepted Answer中的IsDefaultPort
来自CarlosMuñoz。
答案 2 :(得分:28)
Request.Url.GetLeftPart(UriPartial.Authority)
这是包含方案。
答案 3 :(得分:19)
警告!对于使用 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
此错误迫使我将我的域名主机作为字符串插入配置文件中。
答案 4 :(得分:13)
为什么不使用
Request.Url.Authority
它返回整个域和端口。
您仍然需要计算http或https
答案 5 :(得分:2)
简单和简短方式(它支持架构,域和端口):
Request.GetFullDomain()
// Add this class to your project
public static class HttpRequestExtensions{
public static string GetFullDomain(this HttpRequestBase request)
{
var uri= request?.UrlReferrer;
if (uri== null)
return string.Empty;
return uri.Scheme + Uri.SchemeDelimiter + uri.Authority;
}
}
// Now Use it like this:
Request.GetFullDomain();
// Example output: https://www.example.com:5031
// Example output: http://www.example.com:5031
// Example output: https://www.example.com
答案 6 :(得分:1)
怎么样:
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"];
答案 7 :(得分:1)
另一种方式:
string domain;
Uri url = HttpContext.Current.Request.Url;
domain= url.AbsoluteUri.Replace(url.PathAndQuery, string.Empty);
答案 8 :(得分:0)
使用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();
答案 9 :(得分:0)
在 Asp.Net Core 3.1 中,如果要获得完整域,则需要执行以下操作:
第1步:定义变量
private readonly IHttpContextAccessor _contextAccessor;
第2步:将DI插入构造函数
public SomeClass(IHttpContextAccessor contextAccessor)
{
_contextAccessor = contextAccessor;
}
第3步:在您的课程中添加此方法:
private string GenerateFullDomain()
{
string domain = _contextAccessor.HttpContext.Request.Host.Value;
string scheme = _contextAccessor.HttpContext.Request.Scheme;
string delimiter = System.Uri.SchemeDelimiter;
string fullDomainToUse = scheme + delimiter + domain;
return fullDomainToUse;
}
//Examples of usage GenerateFullDomain() method:
//https://example.com:5031
//http://example.com:5031
答案 10 :(得分:-1)
怎么样:
String domain = "http://" + Request.Url.Host