更改System.Uri的端口

Dyp*_*ppl 22 .net c# uri

所以我有这个Uri包含地址的对象,比如说http://localhost:1000/blah/blah/blah.我需要更改端口号并保留地址的所有其他部分.让我们说我需要它http://localhost:1080/blah/blah/blah.

这些Uri对象几乎是不可变的,所以我可以通过Port属性访问端口号,但它是只读的.是否有任何理智的方式来创建一个Uri完全像另一个但具有不同端口的对象?通过"理智",我的意思是"没有乱用正则表达式和字符串操作",因为尽管上面的例子它是微不足道的,它仍然闻起来像一堆蠕虫给我.如果这是唯一的方法,我真的希望它已经由某人实施,并且那里可能有一些助手(虽然我找不到)

提前致谢.

jgl*_*uie 46

你考虑过UriBuilder课吗?

http://msdn.microsoft.com/en-us/library/system.uribuilder.aspx

UriBuilder类提供了一种方便的方法来修改Uri实例的内容,而无需为每个修改创建新的Uri实例.

UriBuilder属性提供对只读Uri属性的读/写访问权限,以便可以对其进行修改.

  • 有关`UriBuilder`的一点需要注意的是,如果你将`Port`设置为** - 1**它会使用协议的默认值,如果你不想要端口#的输出那么有用. (9认同)

ale*_*exn 40

我为UriBuilder投了第二票.我实际上有一个更改URI端口的扩展方法:

public static class UriExtensions {
    public static Uri SetPort(this Uri uri, int newPort) {
        var builder = new UriBuilder(uri);
        builder.Port = newPort;
        return builder.Uri;
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

var uri = new Uri("http://localhost:1000/blah/blah/blah");
uri = uri.SetPort(1337); // http://localhost:1337/blah/blah/blah
Run Code Online (Sandbox Code Playgroud)

  • 在我看来,在这里使用扩展并不好。提供 SetPort 方法,您必须在其中获取用户不需要的返回 Uri。对我来说,像这样使用它才有意义:uri.SetPort(1337); (2认同)