我怎样才能获得网站的基础?

问题描述 投票:169回答:13

我想写一个小助手方法,它返回网站的基本URL。这就是我想出的:

public static string GetSiteUrl()
{
    string url = string.Empty;
    HttpRequest request = HttpContext.Current.Request;

    if (request.IsSecureConnection)
        url = "https://";
    else
        url = "http://";

    url += request["HTTP_HOST"] + "/";

    return url;
}

这有什么错误,你能想到吗?任何人都可以改进吗?

c# asp.net uri httprequest
13个回答
310
投票

试试这个:

string baseUrl = Request.Url.Scheme + "://" + Request.Url.Authority + 
    Request.ApplicationPath.TrimEnd('/') + "/";

1
投票

我正在使用Application_Start中的以下代码

Request.Url.OriginalString.Replace(Request.Url.PathAndQuery, "") + Request.ApplicationPath;


0
投票
String baseUrl = Path.GetDirectoryName(HttpContext.Current.Request.Url.OriginalString);

0
投票

请使用以下代码

 string baseURL = HttpContext.Request.Url.Host;

-2
投票

您可以在端口中添加非端口80 / SSL吗?

就像是:

string.Format("{0}://{1}", Request.url.Scheme, Request.url.Host);

并在最终结果中使用它?


164
投票
string baseUrl = Request.Url.GetLeftPart(UriPartial.Authority)

而已 ;)


8
投票

不幸的是,qzxswpoi的PCL版本不支持流行的GetLeftPart解决方案。然而,Uri是如此,如果您需要可移植性,这应该可以解决问题:

GetComponents

6
投票

对我来说,@ warlock看起来是迄今为止最好的答案,但我过去总是使用它;

uri.GetComponents(
    UriComponents.SchemeAndServer | UriComponents.UserInfo, UriFormat.Unescaped);

或者在Web API控制器中;

string baseUrl = Request.Url.GetComponents(
    UriComponents.SchemeAndServer, UriFormat.UriEscaped)   

这很方便,因此您可以选择所需的转义格式。我不清楚为什么有两个这样不同的实现,并且据我所知,这个方法和@ warlock在这种情况下返回完全相同的结果,但看起来string baseUrl = Url.Request.RequestUri.GetComponents( UriComponents.SchemeAndServer, UriFormat.Unescaped) 也适用于非服务器Uri就像GetLeftPart()标签例如。


6
投票

我相信上面的答案并不考虑网站何时不在网站的根目录中。

这是一个Web Api控制器:

mailto

5
投票

我跟着去

string baseUrl = (Url.Request.RequestUri.GetComponents(
                    UriComponents.SchemeAndServer, UriFormat.Unescaped).TrimEnd('/') 
                 + HttpContext.Current.Request.ApplicationPath).TrimEnd('/') ;

4
投票

这是一种更加万无一失的方法。

HttpContext.Current.Request.ServerVariables["HTTP_HOST"]

4
投票

根据Warlock编写的内容,我发现如果您没有托管在Web的根目录,则需要虚拟路径根。 (这适用于MVC Web API控制器)

VirtualPathUtility.ToAbsolute("~/");

1
投票

这适合我。

String baseUrl = Request.RequestUri.GetLeftPart(UriPartial.Authority) 
+ Configuration.VirtualPathRoot;
  • Request.Url.OriginalString:返回与浏览器显示相同的完整路径。
  • Request.Url.PathAndQuery:返回(完整路径) - (域名+ PORT)。
  • Request.ApplicationPath:在托管服务器上返回“/”,在本地IIS部署上返回“应用程序名称”。

因此,如果您想访问您的域名,请考虑在以下情况下包含应用程序名称:

  1. 美国部署
  2. 如果您的应用程序部署在子域中。
© www.soinside.com 2019 - 2024. All rights reserved.