如何获取站点根URL?

时间:2011-05-02 03:45:20

标签: asp.net

我希望动态获取ASP.NET应用程序的绝对根Url。这需要是以下形式的应用程序的完整根URL:http(s):// hostname(:port)/

我一直在使用这种静态方法:

public static string GetSiteRootUrl()
{
    string protocol;

    if (HttpContext.Current.Request.IsSecureConnection)
        protocol = "https";
    else
        protocol = "http";

    StringBuilder uri = new StringBuilder(protocol + "://");

    string hostname = HttpContext.Current.Request.Url.Host;

    uri.Append(hostname);

    int port = HttpContext.Current.Request.Url.Port;

    if (port != 80 && port != 443)
    {
        uri.Append(":");
        uri.Append(port.ToString());
    }

    return uri.ToString();
}

但是,如果我在范围内没有HttpContext.Current怎么办? 我在CacheItemRemovedCallback中遇到过这种情况。

9 个答案:

答案 0 :(得分:75)

对于WebForms,此代码将返回应用程序根目录的绝对路径,无论应用程序的嵌套方式如何:

HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority) + ResolveUrl("~/")

上面的第一部分返回应用程序的方案和域名(http://localhost),没有尾部斜杠。 ResolveUrl代码返回应用程序根目录(/MyApplicationRoot/)的相对路径。通过将它们组合在一起,您可以获得Web表单应用程序的绝对路径。

使用MVC:

HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority) + Url.Content("~/")

或者,如果您尝试在Razor视图中直接使用它:

@HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority)@Url.Content("~/")

答案 1 :(得分:25)

您可以尝试获取原始URL并在前进斜杠之后修剪所有内容。您还可以合并ResolveUrl("~/")

答案 2 :(得分:11)

public static string GetAppUrl()
{
    // This code is tested to work on all environments
    var oRequest = System.Web.HttpContext.Current.Request;
    return oRequest.Url.GetLeftPart(System.UriPartial.Authority)
        + System.Web.VirtualPathUtility.ToAbsolute("~/");

}

答案 3 :(得分:4)

public static string GetFullRootUrl()
{   
    HttpRequest request = HttpContext.Current.Request;
    return request.Url.AbsoluteUri.Replace(request.Url.AbsolutePath, String.Empty);
}

答案 4 :(得分:1)

 UrlHelper url = new UrlHelper(filterContext.RequestContext);
 string helpurl = url.Action("LogOn", "Account", new { area = "" },
                      url.RequestContext.HttpContext.Request.Url.Scheme);

可以获得绝对网址

答案 5 :(得分:0)

我通过在AppSettings(“SiteRootUrl”)中添加web.config设置解决了这个问题。简单而有效,但另一个配置设置要维护。

答案 6 :(得分:0)

@saluce有一个很好的主意,但他的代码仍然需要一个对象引用,因此无法在某些代码块中运行。使用以下内容,只要您有Current.Request,以下内容就可以使用:

With HttpContext.Current.Request
    Return .Url.GetLeftPart(UriPartial.Authority) + .ApplicationPath + If(.ApplicationPath = "/", Nothing, "/")
End With

无论协议,端口还是根文件夹,这都可以。

答案 7 :(得分:0)

这一直对我有用

document.getElementById("menu_images").onchange = function () {
    var reader = new FileReader();
    if(this.files[0].size>528385){
        alert("Image Size should not be greater than 500Kb");
        $("#menu_image").attr("src","blank");
        $("#menu_image").hide();  
        $('#menu_images').wrap('<form>').closest('form').get(0).reset();
        $('#menu_images').unwrap();     
        return false;
    }
    if(this.files[0].type.indexOf("image")==-1){
        alert("Invalid Type");
        $("#menu_image").attr("src","blank");
        $("#menu_image").hide();  
        $('#menu_images').wrap('<form>').closest('form').get(0).reset();
        $('#menu_images').unwrap();         
        return false;
    }   
    reader.onload = function (e) {
        // get loaded data and render thumbnail.
        document.getElementById("menu_image").src = e.target.result;
        $("#menu_image").show(); 
    };

    // read the image file as a data URL.
    reader.readAsDataURL(this.files[0]);
};

答案 8 :(得分:-1)

基于Uri,但剥离查询字符串并在IIS关闭虚拟目录时进行处理:

private static string GetSiteRoot()
{
    string siteRoot = null;
    if (HttpContext.Current != null)
    {
        var request = HttpContext.Current.Request;
        siteRoot = request.Url.AbsoluteUri
                .Replace(request.Url.AbsolutePath, String.Empty)        // trim the current page off
                .Replace(request.Url.Query, string.Empty);              // trim the query string off

        if (request.Url.Segments.Length == 4)
        {
            // If hosted in a virtual directory, restore that segment
            siteRoot += "/" + request.Url.Segments[1];
        }

        if (!siteRoot.EndsWith("/"))
        {
            siteRoot += "/";
        }
    }

    return siteRoot;
}