Question

How can I consistently get the absolute, fully-qualified root or base url of the site regardless of whether the site is in a virtual directory and regardless of where my code is in the directory structure? I've tried every variable and function I can think of and haven't found a good way.

I want to be able to get the url of the current site, i.e. http://www.example.com or if it's a virtual directory, http://www.example.com/DNN/


Here's some of the things I've tried and the result. The only one that includes the whole piece that I want (http://localhost:4471/DNN441) is 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/Details/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
Was it helpful?

Solution

In reading through the answer provided in Rick Strahl's Blog I found what I really needed was quite simple. First you need to determine the relative path (which for me was the easy part), and pass that into the function defined below:

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();
}

OTHER TIPS

The accepted answer assumes that the current request is already at the server/virtual root. Try this:

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

There is some excellent discussion and ideas on Rick Strahl's blog

EDIT: I should add that the ideas work with or without a valid HttpContext.

EDIT2: Here's the specific comment / code on that post that answers the question

Found this code here:

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);

Have you tried AppSettings.RootUrl which is usually configured in the web.config file?

Are you talking about for use as links?

if so, then doing this <a href='/'>goes to root</a> will take you to the default file of the web root.

Now, for client side, doing, passing "~/" to the Control::ResolveUrl method will provide you what you're looking for. (http://msdn.microsoft.com/en-us/library/system.web.ui.control.resolveurl.aspx)

I have no way to validate this at the moment but have you tried "Request.Url.AbsoluteUri" from another machine?

It occurs to me that as far as your machine is concerned it's browser is requesting from localhost.

I could be wrong though but I think request is relative to the browser and not the webserver.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top