如何从urlstring中删除端口号

我有以下代码片段:

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

由此代码生成的URL包括端口号,我认为这是因为端口80是由网站使用,并在此代码中,我试图从网站的虚拟目录加载页面。 任何想法如何抑制这个代码生成的URLstring中的端口号?

使用Uri.GetComponents方法。 要删除端口组件,您必须组合所有其他组件,如:

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

编辑:我find了一个更好的方法:

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

UriComponents.AbsoluteUri保留所有组件,所以& ~UriComponents.Port将只排除该端口。

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

UriBuilder上将Port属性设置为-1将删除任何显式端口,并隐式使用协议scheme的默认端口值。

基于Ian Flynn理念的更通用的解决scheme(适用于http,https,ftp …)。 此方法不会删除自定义端口(如果有的话)。 自定义端口是根据协议自动定义的。

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

我会用这个System.Uri 。 我没有尝试,但它似乎是ToString会实际输出你想要的:

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

如果没有,你可以结合url -members的组件来创build你的cleanUrlstring。

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

System.Uri的解决scheme也是可能的,但会更臃肿。

你也可以使用URIBuilder 的属性来实现这一点,它具有你想要的方式输出url的属性

好的,谢谢我明白了…用KISS的原理…

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

对于我正在做的是一个testing工具,工作正常