How to remove the port number from a url string

C#asp.net

C# Problem Overview


I have the following code snippet:

string tmp = String.Format("<SCRIPT FOR='window' EVENT='onload' LANGUAGE='JavaScript'>javascript:window.open('{0}');</SCRIPT>", url);

ClientScript.RegisterClientScriptBlock(this.GetType(), "NewWindow", tmp);

The URL generated by this code include the port number and I think that is happening because port 80 is used by the website and in this code I am trying to load a page from a virtual directory of the website. Any ideas on how to suppress the port number in the URL string generated by this code?

C# Solutions


Solution 1 - C#

Use the Uri.GetComponents method. To remove the port component you'll have to combine all the other components, something like:

var uri = new Uri( "http://www.example.com:80/dir/?query=test" );
var clean = uri.GetComponents( UriComponents.Scheme | 
                               UriComponents.Host | 
                               UriComponents.PathAndQuery, 
                               UriFormat.UriEscaped );

EDIT: I've found a better way:

var clean = uri.GetComponents( UriComponents.AbsoluteUri & ~UriComponents.Port,
                               UriFormat.UriEscaped );

UriComponents.AbsoluteUri preservers all the components, so & ~UriComponents.Port will only exclude the port.

Solution 2 - C#

UriBuilder u1 = new UriBuilder( "http://www.example.com:80/dir/?query=test" );
u1.Port = -1;
string clean = u1.Uri.ToString();

Setting the Port property to -1 on UriBuilder will remove any explicit port and implicitly use the default port value for the protocol scheme.

Solution 3 - C#

A more generic solution (works with http, https, ftp...) based on Ian Flynn idea. This method does not remove custom port, if any. Custom port is defined automatically depending on the protocol.

    var uriBuilder = new UriBuilder("http://www.google.fr/");
    if (uriBuilder.Uri.IsDefaultPort)
    {
        uriBuilder.Port = -1;
    }
    return uriBuilder.Uri.AbsoluteUri;

April 2021 update

With newer .NET versions, Uri.AbsoluteUri removes the default ports and retains the custom port by default. The above code-snippet is equivalent to:

    var uriBuilder = new UriBuilder("http://www.google.fr/");
    return uriBuilder.Uri.AbsoluteUri;

Solution 4 - C#

I would use the System.Uri for this. I have not tried, but it seems it's ToString will actually output what you want:

var url = new Uri("http://google.com:80/asd?qwe=asdff");
var cleanUrl = url.ToString();

If not, you can combine the components of the url-members to create your cleanUrl string.

Solution 5 - C#

var url = "http://google.com:80/asd?qwe=zxc#asd";
var regex = new Regex(@":\d+");
var cleanUrl = regex.Replace(url, "");

the solution with System.Uri is also possible but will be more bloated.

Solution 6 - C#

You can use the UriBuilder and set the value of the port to -1

and the code will be like this:

Uri tmpUri = new Uri("http://LocalHost:443/Account/Index");
UriBuilder builder = new UriBuilder(tmpUri);
builder.Port = -1;
Uri newUri = builder.Uri;

Solution 7 - C#

Ok, thanks I figured it out...used the KISS principle...

string redirectstr = String.Format(
   "http://localhost/Gradebook/AcademicHonestyGrid.aspx?StudentID={0}&ClassSectionId={1}&uid={2}", 
   studid, 
   intSectionID, 
   HttpUtility.UrlEncode(encrypter.Encrypt(uinfo.ToXml())));

Response.Redirect(redirectstr );

works fine for what I am doing which is a test harness

Solution 8 - C#

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionBrono The VibratorView Question on Stackoverflow
Solution 1 - C#Danko DurbićView Answer on Stackoverflow
Solution 2 - C#Ian FlynnView Answer on Stackoverflow
Solution 3 - C#labilbeView Answer on Stackoverflow
Solution 4 - C#Isak SavoView Answer on Stackoverflow
Solution 5 - C#zerkmsView Answer on Stackoverflow
Solution 6 - C#khaled salehView Answer on Stackoverflow
Solution 7 - C#Brono The VibratorView Answer on Stackoverflow
Solution 8 - C#PatrickView Answer on Stackoverflow