Learn More





DNN Community Blog

The Community Blog is a personal opinion of community members and by no means the official standpoint of DNN Corp or DNN Platform. This is a place to express personal thoughts about DNNPlatform, the community and its ecosystem. Do you have useful information that you would like to share with the DNN Community in a featured article or blog? If so, please contact .

The use of the Community Blog is covered by our Community Blog Guidelines - please read before commenting or posting.

Slicing and Dicing URLs

Did I just miss it?

Slicing URLsRecently 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
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.


There are currently no comments, be the first to post one.

Comment Form

Only registered users may post comments.


2sic Daniel Mettler (124)
Aderson Oliveira (15)
Alec Whittington (11)
Alex Shirley (10)
Andrew Nurse (30)
Anthony Glenwright (5)
Antonio Chagoury (28)
Ash Prasad (21)
Ben Schmidt (1)
Benjamin Hermann (25)
Benoit Sarton (9)
Beth Firebaugh (12)
Bill Walker (36)
Bob Kruger (5)
Brian Dukes (2)
Brice Snow (1)
Bruce Chapman (20)
Bryan Andrews (1)
cathal connolly (55)
Charles Nurse (163)
Chris Hammond (203)
Chris Paterra (55)
Clinton Patterson (28)
Cuong Dang (21)
Daniel Bartholomew (2)
Dave Buckner (2)
David Poindexter (3)
David Rodriguez (2)
Doug Howell (11)
Erik van Ballegoij (30)
Ernst Peter Tamminga (74)
Geoff Barlow (6)
Gifford Watkins (3)
Gilles Le Pigocher (3)
Ian Robinson (7)
Israel Martinez (17)
Jan Blomquist (2)
Jan Jonas (3)
Jaspreet Bhatia (1)
Jenni Merrifield (6)
Joe Brinkman (269)
John Mitchell (1)
Jon Henning (14)
Jonathan Sheely (4)
Jordan Coopersmith (1)
Joseph Craig (2)
Kan Ma (1)
Keivan Beigi (3)
Ken Grierson (10)
Kevin Schreiner (6)
Leigh Pointer (31)
Lorraine Young (60)
Malik Khan (1)
Matthias Schlomann (15)
Mauricio Márquez (5)
Michael Doxsey (7)
Michael Tobisch (3)
Michael Washington (202)
Mike Horton (19)
Mitchel Sellers (28)
Nathan Rover (3)
Navin V Nagiah (14)
Néstor Sánchez (31)
Nik Kalyani (14)
Peter Donker (52)
Philip Beadle (135)
Philipp Becker (4)
Richard Dumas (22)
Robert J Collins (5)
Roger Selwyn (8)
Ruben Lopez (1)
Ryan Martinez (1)
Salar Golestanian (4)
Sanjay Mehrotra (9)
Scott McCulloch (1)
Scott S (11)
Scott Wilkinson (3)
Scott Willhite (97)
Sebastian Leupold (80)
Shaun Walker (237)
Shawn Mehaffie (17)
Stefan Cullmann (12)
Stefan Kamphuis (12)
Steve Fabian (31)
Timo Breumelhof (24)
Tony Henrich (3)
Torsten Weggen (2)
Vicenç Masanas (27)
Vincent Nguyen (3)
Vitaly Kozadayev (6)
Will Morgenweck (37)
Will Strohl (163)
William Severance (5)
Try Evoq
For Free
Start Free Trial
a Demo
See Evoq Live
Need More Information?