在asp.net中确定站点的绝对,完全限定的url

时间:2020-03-06 14:36:28  来源:igfitidea点击:

无论站点是否在虚拟目录中以及代码在目录结构中的何处,我如何始终如一地获取站点的绝对,完全限定的根目录或者基础URL?我已经尝试过我能想到的每个变量和函数,但都没有找到好的方法。

我希望能够获取当前站点的网址,即http://www.example.com,或者如果它是虚拟目录,则为http://www.example.com/DNN/

这是我尝试过的一些事情以及结果。唯一包含我想要的整个文件(http:// localhost:4471 / DNN441)的是Request.URI.AbsoluteURI:

  • Request.PhysicalPath:C:\ WebSites \ DNN441 \ Default.aspx
  • Request.ApplicationPath:/ DNN441
  • Request.PhysicalApplicationPath:C:\ WebSites \ DNN441 \
  • MapPath:C:\ WebSites \ DNN441 \ DesktopModules \ Articles \ Templates \ Default.aspx
  • RawURL:/DNN441/ModuleTesting/Articles/tabid/56/ctl/Det​​ails/mid/374/ItemID/1/Default.aspx
  • Request.Url.AbsoluteUri:http:// localhost:4471 / DNN441 / Default.aspx
  • Request.Url.AbsolutePath:/DNN441/Default.aspx
  • Request.Url.LocalPath:/DNN441/Default.aspx Request.Url.Host:本地主机
  • Request.Url.PathAndQuery:/DNN441/Default.aspx?TabId=56&ctl=Details&mid=374&ItemID=1

解决方案

里克·斯特拉尔(Rick Strahl)的博客上有一些精彩的讨论和想法

编辑:我应该补充说,无论有没有有效的HttpContext,这些想法都可以工作。

EDIT2:这是回答该问题的帖子上的特定注释/代码

我们是否尝试过通常在web.config文件中配置的AppSettings.RootUrl?

我们是在谈论用作链接吗?

如果是这样,那么执行<a href='/'>进入根目录</a>`会将我们带到网络根目录的默认文件。

现在,对于客户端而言,将"〜/"传递给Control :: ResolveUrl方法将为我们提供所需的内容。 (http://msdn.microsoft.com/zh-cn/library/system.web.ui.control.resolveurl.aspx)

我目前无法验证此方法,但是我们是否尝试从另一台计算机尝试" Request.Url.AbsoluteUri"?

据我所知,就机器而言,它的浏览器是从本地主机请求的。

我可能是错的,但我认为请求是相对于浏览器而不是Web服务器的。

通过阅读Rick Strahl博客中提供的答案,我发现我真正需要的非常简单。首先,我们需要确定相对路径(对我来说这是最简单的部分),并将其传递给下面定义的函数:

VB.NET

Public Shared Function GetFullyQualifiedURL(ByVal s as string) As String
   Dim Result as URI = New URI(HttpContext.Current.Request.Url, s)
   Return Result.ToString
End Function

C#

public static string GetFullyQualifiedURL(string s) {
    Uri Result = new Uri(HttpContext.Current.Request.Url, s);
    return Result.ToString();
}

在这里找到此代码:

string appPath = null;

appPath = string.Format("{0}://{1}{2}{3}",
    Request.Url.Scheme,
    Request.Url.Host,
    Request.Url.Port == 80 ? string.Empty : ":" + Request.Url.Port,
    Request.ApplicationPath);