如何从url字符串中删除端口号

Bro*_*tor 64 c# asp.net

我有以下代码片段:

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

ClientScript.RegisterClientScriptBlock(this.GetType(), "NewWindow", tmp);
Run Code Online (Sandbox Code Playgroud)

此代码生成的URL包括端口号,我认为这是发生的,因为网站使用端口80,在此代码中我尝试从网站的虚拟目录加载页面.有关如何抑制此代码生成的URL字符串中的端口号的任何想法?

Dan*_*bić 125

使用该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 );
Run Code Online (Sandbox Code Playgroud)

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

var clean = uri.GetComponents( UriComponents.AbsoluteUri & ~UriComponents.Port,
                               UriFormat.UriEscaped );
Run Code Online (Sandbox Code Playgroud)

UriComponents.AbsoluteUri保留所有组件,因此& ~UriComponents.Port只会排除端口.

  • 根据最新编辑:严重说我不能再投票了.超级优雅的答案;-) (6认同)

Ian*_*ynn 71

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

将该Port属性设置为-1on UriBuilder将删除任何显式端口,并隐式使用协议方案的默认端口值.

  • 请注意,您可能想要使用 `.AbsoluteUri`,而不是 `.ToString` /sf/answers/533749471/ (2认同)

lab*_*lbe 36

一个更通用的解决方案(适用于http,https,ftp ...)基于Ian Flynn的想法.此方法不会删除自定义端口(如果有).根据协议自动定义自定义端口.

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

  • 完美主义者;)+1 (3认同)
  • 请注意,您可能希望使用`.AbsoluteUri`,而不是`.ToString` /sf/answers/533749471/ (3认同)

Isa*_*avo 8

我会使用System.Uri.我没试过,但似乎ToString实际上会输出你想要的东西:

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

如果没有,您可以组合url-members 的组件来创建cleanUrl字符串.

  • 这不会删除默认端口以外的端口.(80,大多数情况下) (4认同)

zer*_*kms 5

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

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

  • 一行 :) url = Regex.Replace(url, @":\d+", ""); (3认同)