Reputation: 1155
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?
Upvotes: 82
Views: 50065
Reputation: 3584
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;
Upvotes: 52
Reputation: 518
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;
Upvotes: 2
Reputation: 3727
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.
Upvotes: 98
Reputation: 1155
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
Upvotes: 0
Reputation: 7237
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.
Upvotes: 156
Reputation: 17973
You can also use the properties of URIBuilder for this, it has properties for outputting an url the way you want
Upvotes: 0
Reputation: 35884
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.
Upvotes: 8
Reputation: 254926
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.
Upvotes: 4