【问题标题】:How to remove the port number from a url string如何从 url 字符串中删除端口号
【发布时间】:2010-05-12 13:44:06
【问题描述】:

我有以下代码sn-p:

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 字符串中的端口号的任何想法?

【问题讨论】:

  • 你应该通过点击答案的分数来接受你问题的最佳答案!

标签: c# asp.net


【解决方案1】:

使用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 保留所有组件,因此&amp; ~UriComponents.Port 只会排除端口。

【讨论】:

  • 根据最新编辑:很遗憾我不能再次投票。超级优雅的答案;-)
  • 谢谢!通常你只是“或”标志枚举,所以我几乎忘记了你可以使用其他按位运算。
  • 非常干净的解决方案,只是在 Uri 中添加了一个 ToCleanUrl() 扩展
  • Danko 解决方案对我来说没有用 uri = new Uri("localhost:52798") 所以我使用 var clean = uri.OriginalString.Replace(":" + uri.LocalPath,"") ;看起来很难看,但很有效
【解决方案2】:
UriBuilder u1 = new UriBuilder( "http://www.example.com:80/dir/?query=test" );
u1.Port = -1;
string clean = u1.Uri.ToString();

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

【讨论】:

  • 我发现在这个解决方案中跳过 u1.Port = -1; 对我有用 - 尽管上面的那个也会排除任何端口号,而不仅仅是 80,所以这在某些情况下可能仍然有用。
  • 请注意,您可能要使用.AbsoluteUri,而不是.ToString stackoverflow.com/a/7624992/29
  • Port 设置为-1 后不需要调用Uri。相反,它可以简单地是string clean = u1.ToString();
【解决方案3】:

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

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

2021 年 4 月更新

对于较新的 .NET 版本,Uri.AbsoluteUri 会删除默认端口并默认保留自定义端口。上面的代码-sn-p相当于:

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

【讨论】:

  • 完美主义者 ;) +1
  • 请注意,您可能希望使用.AbsoluteUri,而不是.ToString stackoverflow.com/a/7624992/29
  • .AbsoluteUri 默认不剥离默认端口吗?我们还需要第一部分吗?
  • @ShubhamSharma 它似乎随着最新的 .net 框架而改变了。
【解决方案4】:

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

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

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

【讨论】:

  • 不会删除默认端口以外的端口。 (大多数情况下为 80)
  • 是的,错过了“当端口是方案的默认端口时,此方法返回的字符串不包含端口信息。” (msdn.microsoft.com/en-us/library/system.uri.tostring.aspx) 写我的答案时
  • @Jens:它不应该删除其他端口。 http 方案只有 80 应该是默认值。如果您删除任何端口 - 那么您将获得指向另一个资源的 url。
【解决方案5】:
var url = "http://google.com:80/asd?qwe=zxc#asd";
var regex = new Regex(@":\d+");
var cleanUrl = regex.Replace(url, "");

System.Uri的解决方案也是可以的,但是会比较臃肿。

【讨论】:

  • 不会替换所有 :xxx 出现的地方,如果在查询字符串中有一个
  • 那个正则表达式会破坏像http://asdf.com:80/asdf?something:12:34:56这样的URI。 (当然,该 URI 应该被正确编码,但你不能确定它是)
  • @Isak:你可以使用@"(?&lt;![^/]/[^/]*):\d+" 来避免这种情况。
  • @Isak:我不确定我们是否应该使用结构错误的 url。 RFC 要求查询路径中的“:”应编码为 %3A。点。
  • 一行 :) url = Regex.Replace(url, @":\d+", "");
【解决方案6】:

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

代码会是这样的:

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

【讨论】:

    【解决方案7】:

    好的,谢谢我想通了...使用了 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 );
    

    适用于我正在做的测试工具

    【讨论】:

      【解决方案8】:

      您也可以为此使用the propertiesURIBuilder,它具有以您想要的方式输出网址的属性

      【讨论】:

      • 伙计们,我试图在命令生成 url 字符串之前禁止端口号。如果无法使用此命令,我也愿意接受等效的解决方案。
      • 请注意 tmp 变量的内容是:
      • 在我看来像是 .net 框架中的某些东西,或者 IIS 正在添加 localhost:port 编号
      • 使用UriBuilder.Uri 属性,然后您可以使用此线程中顶部答案中显示的模板。
      猜你喜欢
      • 2016-02-06
      • 2014-12-18
      • 2014-07-18
      • 2011-07-04
      • 2015-08-17
      • 2020-10-13
      • 1970-01-01
      相关资源
      最近更新 更多