253

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

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

我需要返回:

http://www.mywebsite.com:80

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

有什么建议么?

4

7 回答 7

438

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

于 2009-02-23T15:45:56.450 回答
184

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

Uri uri = new Uri("http://www.mywebsite.com:80/pages/page1.aspx");
string requested = uri.Scheme + Uri.SchemeDelimiter + uri.Host + ":" + uri.Port;
于 2008-08-22T13:35:39.863 回答
67

好吧,如果您在 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

我希望这有帮助。:)

于 2010-11-16T14:42:41.360 回答
38

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

var builder = new UriBuilder(Request.Url.Scheme, Request.Url.Host, Request.Url.Port);
于 2011-03-08T21:56:59.850 回答
23

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

样本:

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

希望这可以帮助。

于 2008-08-22T02:48:54.160 回答
23

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

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

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

于 2015-09-16T18:07:52.010 回答
13

与霍尔格的回答非常相似。如果您需要获取 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 类提供了一整套方法,其中很多我没有列出。

在我的例子中,我需要和 一起抓取LocalHostPort Number所以这就是我所做的:

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

其中成功抢到:http://localhost:12345

于 2015-11-14T22:40:55.417 回答