.NET-获取协议,主机和端口


228

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

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

我需要退货:

http://www.mywebsite.com:80

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

有什么建议?


1
见我回答一个问题simlar这里- stackoverflow.com/a/1534478/98740
WDuffy

Answers:


172

以下(C#)代码应该可以解决问题

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

26
或请求的字符串= uri.Scheme + Uri.SchemeDelimiter + uri.Authority;
tranmq 2012年

17
可以说这是错误的答案,因为即使没有端口,它也会插入“:”。使用Uri.GetLeftPart如@dthrasher指出
GMAN

请注意,在某些情况下,您仍想使用uri.Headers [“ Host”]而不是GetLeftPart()进行连接,例如,在代理后面,您的服务可能正在侦听其他/非标准端口,并且如果您在主机将无法访问回调(使用专用端口)。
doveryai

408

即使@Rick对于此问题已被接受,但实际上,使用命名不正确的Uri.GetLeftPart()方法实际上有一种更短的方法。

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,则将其包含在结果中。


12
我认为这是最好的例子。它适用于localhost:port和实时实例。
松饼人

13
GetLeftPart-确实,OMG很好的命名。
Valentin Kuzub 2015年

有谁知道网址的这一部分是否具有常用名称?在JavaScript中,它被称为原产地,但我不知道这是普遍同意:serverfault.com/questions/757494/...
德克波尔

1
Microsoft为此使用术语“ Authority”,但是我不知道这是否是标准术语。参见stackoverflow.com/questions/2142910/…–
dthrasher

1
我个人不喜欢以Uri这种方式使用该类。在很多情况下,此构造函数将引发异常。在大多数情况下,我希望我的代码在放弃手头的任务之前要宽容一些。
乔纳森·伍德

60

好吧,如果您在Asp.Net中进行此操作或可以访问HttpContext.Current.Request,我会说这些是更简单,更通用的获取方法:

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

我希望这有帮助。:)


1
我更喜欢这种方法,我可以只得到想要的调料,而不必担心字符串是否格式正确以获取端口。+1
Jrud

有关这些属性的更多详细信息:blog.jonschneider.com/2014/10/…–
乔恩·施耐德

33

一种更结构化的方法是使用UriBuilder。这样可以避免直接的字符串操作。

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

23

Request.Url将向您返回请求的Uri。一旦有了它,您就可以检索几乎所有您想要的东西。要获取协议,请调用Scheme属性。

样品:

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

希望这可以帮助。


20

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

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

通过UriComponents枚举,您可以指定要包含的URI的哪些组件。


1
太好了,因为它可以在PCL中使用(.GetLeftPart()在该处不可用)
Sascha

10

非常类似于Holger的答案。如果您需要获取URL,可以执行以下操作:

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类提供了一整套的方法,有很多我还没有上市。

在我的情况下,我需要抢LocalHost随着一起Port Number,所以这是我做的:

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

哪个成功抢了: http://localhost:12345

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.