Did I just miss it?
Recently while working on a download manager for the new DotNetNuke Marketplace I needed a simple function to return the base URL including the virtual directory. When sending out emails from ASP.Net applications it is important to use the full URL to a resource rather than a relative or absolute path since the email recipient will not be able to follow a partial URL.
Well, after reviewing the HttpRequest class and the various properties, I could not find a property that would return this simple value. Surely a method or property must exist to provide this value. Wait, there it is... the lowly ResolveUrl method of the Control class. What? This method is not static/shared. But I don't have a control instance. My code is running in a simple utility class. Oh well. So what do I do now? That's right. I did what any good/lazy programmer would do and I googled the answer. Surely I am not the only one to have this problem.
Google is such a time saver. Instead of spending 10 minutes writing this simple utility function and recreating the wheel I can get a quick answer from Google. Surely, such a trivial function has been written by some brilliant programmer who will take into account all the possible URL permutations to give me my answer. So I type in my keywords and press "Search". Almost done. Just need to look through these links. Click... Read... nope, not this one. Click... Read... close, but not what I'm looking for. Click... Read... Yes. This is perfect. I just rewrite my whole app in PHP and I have my solution... next.. Click... Read... Click... Read... Well, after 30 minutes I determine that nobody has the solution I need. Wow. Google was so helpful. I am sure my answer was on page 4 if only I was a little more persistent. So, now there is no getting around it. I will need to do real work and write some code.
So with VS2005 fired up and my utility class open, I churn out the following method (NOTE: this is not completely generic but it is close enough. I'll leave it as an exercise for the reader to make it more generic):
public String GetDownloadRoot()
{
HttpRequest Request = HttpContext.Current.Request;
Uri RequestUrl = Request.Url;
string port = (RequestUrl.IsDefaultPort ? string.Empty : String.Format(":{0}", Request.Url.Port));
return String.Format("{0}://{1}{2}{3}/orderdownloads", RequestUrl.Scheme, RequestUrl.Host, port, Request.ApplicationPath);
}
Now, I know what a lot of you are thinking... What the @#)%&$ is up with those curly braces and semi-colons. What kinda VB is that? Is this VB 9 from Orcas? No, no... calm down. It's ok. It's just a little C#. Not all code must be written in VB. Sometimes I will cross over to the dark side and write in C# just to up my street cred. I have even been known to write in Java. Shhhh... don't tell anyone. But just for you VB types here is the equivalent code:
Public Function GetDownloadRoot() As String
Dim Request As HttpRequest = HttpContext.Current.Request
Dim RequestUrl As Uri = Request.Url
Dim port As String = IIf((RequestUrl.IsDefaultPort , String.Empty , String.Format()":{0}",Request.Url.Port))
Return String.Format("{0}://{1}{2}{3}/orderdownloads", RequestUrl.Scheme, RequestUrl.Host, port, Request.ApplicationPath)
End Function
I find that converting from VB to C# or C# to VB is almost second nature now. I just google the answer.
So this is the part where you, the reader, tell me how you deal with this issue, or how if I would've just looked on the third search page the answer was right there.