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


71

我有以下代码片段:

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而引起的,在此代码中,我试图从网站的虚拟目录中加载页面。关于如何隐藏此代码生成的URL字符串中的端口号的任何想法?


3
单击答案得分下的粗体,您应该接受问题的最佳答案!
ahmadali shafiee 2012年

Answers:


142

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

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

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

UriComponents.AbsoluteUri保存所有组件,因此& ~UriComponents.Port将仅排除端口。


6
根据最新的编辑:很遗憾,我不能再次投票。超级优雅的答案;-)
zerkms,2010年

谢谢!通常,您只是“或”标志枚举,所以我几乎忘记了您可以使用其他按位运算。
DankoDurbić2010年

1
非常干净的解决方案,只是向Uri添加了ToCleanUrl()扩展
Gent,

Danko解决方案对uri = new Uri(“ localhost:52798”)不利,因此我使用var clean = uri.OriginalString.Replace(“:” + uri.LocalPath,“”); 看起来很丑但是可以工作
Xavave '17

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

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


1
我发现只是跳过u1.Port = -1;此解决方案对我有用-尽管上面的解决方案还将排除任何端口号,而不仅仅是80,因此在某些情况下仍然有用。
StormPooper 2014年

2
请注意,您可能要使用.AbsoluteUri而不是.ToString stackoverflow.com/a/7624992/29
Michael Haren

Uri将设置Port-1后,不需要调用。取而代之的可能是string clean = u1.ToString();
Ray

40

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

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

3
完美主义者;)+1
T-moty 2016年

4
请注意,您可能要使用.AbsoluteUri而不是.ToString stackoverflow.com/a/7624992/29
Michael Haren

7

我将为此使用System.Uri。我没有尝试过,但是看来ToString实际上会输出您想要的:

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

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


5
不会删除默认端口以外的端口。(大多数情况下为80)
Jens

是的,错过了“当端口是方案的默认端口时,此方法返回的字符串不包含端口信息。” (msdn.microsoft.com/en-us/library/system.uri.tostring.aspx)当写我的答案时
zerkms 2010年

@Jens:它不应删除其他端口。http方案应该默认为仅80。如果删除任何端口-那么您将获得指向另一个资源的URL。
zerkms 2010年

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

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


不会替换所有:xxx事件,如果查询字符串中有一个
符文FS 2010年

该正则表达式将破坏URI,例如http://asdf.com:80/asdf?something:12:34:56。(当然,应该正确编码URI,但不能确定是URI)
Isak Savo 2010年

@Isak:您@"(?<![^/]/[^/]*):\d+"可以避免这种情况。
詹斯2010年

@Isak:我不确定我们应该使用错误构造的URL进行操作。RFC要求查询路径中的“:”应编码为%3A。点。
zerkms 2010年

3
一行:) url = Regex.Replace(url,@“:\ d +”,“”);
比昂·汤姆森

1

您还可以使用属性URIBuilder对于这一点,它具有输出的URL你想要的方式特性


伙计们,我正在尝试在命令生成url字符串之前禁止端口号。如果无法使用此命令,我也愿意接受等效的解决方案。
振动器Brono,2010年

请注意,tmp变量的内容为:<SCRIPT FOR ='window'EVENT ='onload'LANGUAGE ='JavaScript'> javascript:window.open('../ Gradebook / AcademicHonestyGrid.aspx?StudentID = 35832&ClassSectionId = 8487&uid = yjoEG2CuaptYAyqOEPwBFSbAarVk%...(由于加密和太长而被省略)
Brono振动器2010年

在我看来,.net框架或IIS中的某些东西正在添加localhost:port
Brono The Vibrator,2010年

使用该UriBuilder.Uri属性,然后可以使用该线程顶部答案中显示的模板。
maxp

1

好的,谢谢我弄清楚了...使用了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 );

对于我正在做的工作很好,这是一个测试工具


1

您可以使用UriBuilder并将端口的值设置为-1

和代码将是这样的:

Uri tmpUri = new Uri("http://LocalHost:443/Account/Index");
UriBuilder builder = new UriBuilder(tmpUri);
builder.Port = -1;
Uri newUri = builder.Uri;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.