关于asp.net:.NET – 获取协议,主机和端口

.NET - Get protocol, host, and port

.NET中是否有一种简单的方法可以快速获取当前协议、主机和端口?例如,如果我在以下URL上:

http://www.mywebsite.com:80/pages/page1.aspx

我要回去:

http://www.mywebsite.com:80

我知道我可以使用Request.Url.AbsoluteUri获取完整的URL,我知道我可以使用Request.Url.Authority获取主机和端口,但我不确定在不解析URL字符串的情况下获取协议的最佳方法。

有什么建议吗?


尽管@rick已经接受了这个问题的答案,但实际上有一种更短的方法可以做到这一点,即使用名称不好的Uri.GetLeftPart()方法。

1
2
Uri url = new Uri("http://www.mywebsite.com:80/pages/page1.aspx");
string output = url.GetLeftPart(UriPartial.Authority);

不过,对GetLeftPart()来说,有一个陷阱。如果端口是方案的默认端口,它将把它去掉。由于端口80是HTTP的默认端口,在我上面的示例中,GetLeftPart()的输出将是http://www.mywebsite.com

如果端口号不是80,它将包含在结果中。


下面的(c)代码应该可以做到这一点

1
2
Uri uri = new Uri("http://www.mywebsite.com:80/pages/page1.aspx");
string requested = uri.Scheme + Uri.SchemeDelimiter + uri.Host +":" + uri.Port;


如果您在ASP.NET中执行此操作,或者可以访问httpContext.current.request我想说,这些是更简单和更一般的方法:

1
2
3
4
var scheme = Request.Url.Scheme; // will get http, https, etc.
var host = Request.Url.Host; // will get www.mywebsite.com
var port = Request.Url.Port; // will get the port
var path = Request.Url.AbsolutePath; // should get the /pages/page1.aspx part, can't remember if it only get pages/page1.aspx

我希望这有帮助。:)


一种更结构化的方法是使用uribuilder。这避免了直接的字符串操作。

1
var builder = new UriBuilder(Request.Url.Scheme, Request.Url.Host, Request.Url.Port);

url将返回请求的URI。一旦你拥有了它,你就可以得到你想要的任何东西。要获取协议,请调用Scheme属性。

Sample:

1
2
Uri url = Request.Url;
string protocol = url.Scheme;

希望这有帮助。


甚至更短的方法,可能需要更新的ASP.NET:

1
string authority = Request.Url.GetComponents(UriComponents.SchemeAndServer,UriFormat.Unescaped)

UriComponents枚举允许您指定要包括的URI组件。


与霍尔格的答案非常相似。如果需要获取URL,可以执行以下操作:

1
2
3
4
5
Uri uri = Context.Request.Url;        
var scheme = uri.Scheme // returns http, https
var scheme2 = uri.Scheme + Uri.SchemeDelimiter; // returns http://, https://
var host = uri.Host; // return www.mywebsite.com
var port = uri.Port; // returns port number

URI类提供了一系列方法,其中许多方法我没有列出。

在我的例子中,我需要抓住LocalHostPort Number,所以我这样做了:

1
2
var Uri uri = Context.Request.Url;
var host = uri.Scheme + Uri.SchemeDelimiter + uri.Host +":" + uri.Port;

成功抓获:http://localhost:12345