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

Posted

技术标签:

【中文标题】.NET - 获取协议、主机和端口【英文标题】:.NET - Get protocol, host, and port 【发布时间】:2010-09-06 12:06:12 【问题描述】:

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

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

我需要返回:

http://www.mywebsite.com:80

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

有什么建议吗?

【问题讨论】:

在这里查看我对类似问题的回答 - ***.com/a/1534478/98740 【参考方案1】:

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

示例:

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

希望这会有所帮助。

【讨论】:

【参考方案2】:

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

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

【讨论】:

或请求的字符串 = uri.Scheme + Uri.SchemeDelimiter + uri.Authority; 这可以说是错误的答案,因为即使没有端口,它也会插入一个“:”。正如@dthrasher 指出的那样使用Uri.GetLeftPart 请注意,在某些情况下,您仍然希望与 uri.Headers["Host"] 而不是 GetLeftPart() 连接,例如在代理后面,您的服务可能正在侦听不同/非标准端口,如果您在回调中使用该 url(使用私有端口),则主机将无法访问。 这个答案...如此美丽、优雅和简单。 使用此解决方案无需担心没有端口号。微软表示“如果端口未指定为 URI 的一部分,则端口属性返回协议的默认值。” /docs.microsoft.com/en-us/dotnet/api/…【参考方案3】:

尽管@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,它将包含在结果中。

【讨论】:

这是我认为最好的例子。它适用于 localhost:port 和实时实例。 GetLeftPart - 真的,天哪,命名不错。 有谁知道这部分网址是否有一个常用的名称?在 javascript 中它被称为 Origin,但我不确定这是否得到普遍认可:serverfault.com/questions/757494/… 微软为此使用了“权威”一词,但我不知道这是否是一个标准术语。见***.com/questions/2142910/… 我个人不喜欢这样使用Uri 类。在许多情况下,此构造函数将引发异常。在大多数情况下,我希望我的代码在中止手头的任务之前更加宽容。【参考方案4】:

如果您在 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 有关这些属性的更多详细信息:blog.jonschneider.com/2014/10/…【参考方案5】:

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

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

【讨论】:

【参考方案6】:

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

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

UriComponents 枚举允许您指定要包含的 URI 的哪些组件。

【讨论】:

太好了,因为它在 PCL 中工作(.GetLeftPart() 在那里不可用)【参考方案7】:

与 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 class 提供了一系列方法,其中很多我没有列出。

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

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

成功抓取的:http://localhost:12345

【讨论】:

以上是关于.NET - 获取协议、主机和端口的主要内容,如果未能解决你的问题,请参考以下文章

js获取当前URL参数端口IP等信息

网络编程和反射机制

使用如下啥协议可自动获取网关与dns

在运行时获取IIS绑定

USB协议[转]__总结得很好

python 如何获取url信息