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

Posted

技术标签:

【中文标题】在 asp.net 中确定站点的绝对、完全限定的 url【英文标题】:Determine site's absolute, fully-qualified url in asp.net 【发布时间】:2010-09-12 10:13:34 【问题描述】:

无论网站是否在虚拟目录中,也无论我的代码在目录结构中的什么位置,我如何才能始终如一地获得网站的绝对、完全限定的根 URL 或基本 URL?我已经尝试了我能想到的所有变量和函数,但没有找到好的方法。

我希望能够获取当前站点的 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\ 地图路径: C:\WebSites\DNN441\DesktopModules\Articles\Templates\Default.aspx 原始网址: /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: localhost Request.Url.PathAndQuery: /DNN441/Default.aspx?TabId=56&ctl=Details&mid=374&ItemID=1

【问题讨论】:

【参考方案1】:

在阅读 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();

【讨论】:

我认为只有当您当前的请求已经在根目录时才有效。否则,它相对于当前请求的目录,而不是服务器应用程序路径根目录。我取得了成功:Request.Url.GetLeftPart(UriPartial.Authority) + Request.ApplicationPath【参考方案2】:

接受的答案假定当前请求已经在服务器/虚拟根目录。试试这个:

Request.Url.GetLeftPart(UriPartial.Authority) + Request.ApplicationPath

【讨论】:

有时我确实发现这是首选选项。还不足以将其更改为接受的答案,但也许及时。【参考方案3】:

Rick Strahl's blog上有一些很棒的讨论和想法

编辑:我应该补充一点,无论有没有有效的 HttpContext,这些想法都有效。

EDIT2:这是该帖子上回答问题的specific comment / code

【讨论】:

页面上的最后一篇文章似乎确实是我需要的答案。我还没有“接受”这个答案,因为我讨厌人们必须通读那里的所有内容才能得到最终答案......不确定我是否应该在这里重新发布最后一篇文章或者最好的解决方案是什么.【参考方案4】:

找到this code here:

string appPath = null;

appPath = string.Format("0://123",
    Request.Url.Scheme,
    Request.Url.Host,
    Request.Url.Port == 80 ? string.Empty : ":" + Request.Url.Port,
    Request.ApplicationPath);

【讨论】:

【参考方案5】:

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

【讨论】:

这将用于 DotNetNuke 模块,大多数 DotNetNuke 站点没有此设置。【参考方案6】:

你是说用作链接吗?

如果是这样,那么执行此操作<a href='/'>goes to root</a> 会将您带到 Web 根目录的默认文件。

现在,对于客户端,将“~/”传递给 Control::ResolveUrl 方法将为您提供所需的内容。 (http://msdn.microsoft.com/en-us/library/system.web.ui.control.resolveurl.aspx)

【讨论】:

不,这些都是相对链接。我需要绝对的、完全合格的根。我有多种情况需要这个,现在具体的一个是这样我可以将退货和取消网址传递给 Paypal。【参考方案7】:

我目前无法验证这一点,但您是否尝试过另一台机器上的“Request.Url.AbsoluteUri”?

在我看来,就您的机器而言,它的浏览器正在从 localhost 请求。

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

【讨论】:

以上是关于在 asp.net 中确定站点的绝对、完全限定的 url的主要内容,如果未能解决你的问题,请参考以下文章

如何确定 ASP.NET 站点 (IIS) 上的用户数?他们的信息呢?

asp.net mvc 站点的安全最佳实践?

asp.net中Server.MapPath是啥意思?

vs2005如何建立一个WEB站点?

TypeScript Compiler API:如何在没有绝对路径的情况下获取类型的完全限定名称?

无法运行asp.net