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

Jer*_*emy 215 .net asp.net url authority uri

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

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

我需要回复:

http://www.mywebsite.com:80

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

有什么建议?

dth*_*her 389

尽管@Rick已经接受了这个问题的答案,但实际上有一种更简单的方法,使用命名不佳的Uri.GetLeftPart()方法.

Uri url = new Uri("http://www.mywebsite.com:80/pages/page1.aspx");
string output = url.GetLeftPart(UriPartial.Authority);
Run Code Online (Sandbox Code Playgroud)

GetLeftPart()然而,有一个问题.如果端口是方案的默认端口,则会将其删除.由于端口80是http的默认端口,因此GetLeftPart()上面示例中的输出将是http://www.mywebsite.com.

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

  • GetLeftPart - 真的,OMG很好的命名. (12认同)
  • 这是我认为最好的例子.它适用于localhost:端口和实时实例. (11认同)
  • 微软为此使用术语“权威”,但我不知道这是否是标准术语。请参阅http://stackoverflow.com/questions/2142910/whats-the-difference- Between-uri-host-and-uri-authority (2认同)
  • 我个人不喜欢以这种方式使用“Uri”类。在很多情况下,这个构造函数都会抛出异常。对于大多数情况,我希望我的代码在中止手头的任务之前更宽容一些。 (2认同)

Ric*_*ick 162

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

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

  • 或者要求的字符串= uri.Scheme + Uri.SchemeDelimiter + uri.Authority; (26认同)
  • 这可以说是错误的答案,因为即使没有端口,它也会插入":".使用`Uri.GetLeftPart`作为@dthrasher指出 (16认同)

Hol*_*ger 58

好吧,如果您在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
Run Code Online (Sandbox Code Playgroud)

我希望这有帮助.:)


小智 31

更有条理的方法是使用UriBuilder.这避免了直接字符串操作.

var builder = new UriBuilder(Request.Url.Scheme, Request.Url.Host, Request.Url.Port);
Run Code Online (Sandbox Code Playgroud)


Dal*_*gan 22

Request.Url将返回请求的Uri.一旦你拥有了它,你可以检索你想要的任何东西.要获取协议,请调用Scheme属性.

样品:

Uri url = Request.Url;
string protocol = url.Scheme;
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.


Mar*_*iro 17

更短的方式,可能需要更新的ASP.Net:

string authority = Request.Url.GetComponents(UriComponents.SchemeAndServer,UriFormat.Unescaped)
Run Code Online (Sandbox Code Playgroud)

UriComponents枚举允许您指定要包含的URI的哪个(哪些)组件.


ben*_*bia 9

与霍尔格的回答非常相似.如果您需要抓取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
Run Code Online (Sandbox Code Playgroud)

Uri类提供的,我还没有上市方法,有很多的整个范围.

在我的情况下,我需要抓住LocalHost与一起Port Number,所以这是我做的:

var Uri uri = Context.Request.Url;
var host = uri.Scheme + Uri.SchemeDelimiter + uri.Host + ":" + uri.Port; 
Run Code Online (Sandbox Code Playgroud)

哪个成功抓住: http://localhost:12345