2011-05-26 32 views
19

Así que tengo este objeto Uri que contiene una dirección, algo así como http://localhost:1000/blah/blah/blah. Necesito cambiar el número de puerto y dejar todas las demás partes de la dirección intactas. Digamos que necesito que sea http://localhost:1080/blah/blah/blah.Cambiando el puerto del System.Uri

Los objetos Uri son prácticamente inmutables, así que puedo acceder al número de puerto a través de la propiedad Port, pero es de solo lectura. ¿Hay alguna forma sensata de crear un objeto Uri exactamente igual a otro pero con un puerto diferente? Con "sano" me refiero a "sin meterme con expresiones regulares y manipulaciones de cadenas" porque aunque es trivial para el ejemplo anterior, todavía me huele a una lata de gusanos. Si esa es la única manera, realmente espero que ya haya sido implementado por alguien y haya algunos ayudantes por ahí tal vez (aunque no encontré ninguno)

Gracias de antemano.

Respuesta

42

¿Has considerado la clase UriBuilder?

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

La clase UriBuilder proporciona una manera conveniente para modificar el contenido de una instancia de Uri sin crear una nueva instancia Uri para cada modificación.

Las propiedades de UriBuilder proporcionan acceso de lectura/escritura a las propiedades de URI de solo lectura para que puedan modificarse.

+9

Una cosa a tener en cuenta sobre la 'UriBuilder' es que si se establece el' Port' a ** -1 ** usa el valor predeterminado para el protocolo, tan útil si no desea el resultado del # de puerto. –

+0

@PaulTyng gracias por esa joya escondida! Eso es exactamente lo que estaba buscando. (junto con la clase UriBuilder) –

+0

¿Qué es Scheme, sin embargo? ¿Qué hace, y qué debería poner allí? – Cullub

37

En segundo lugar, un voto para UriBuilder. De hecho, tengo un método de extensión para cambiar el puerto de un 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; 
    } 
} 

Uso:

var uri = new Uri("http://localhost:1000/blah/blah/blah"); 
uri = uri.SetPort(1337); // http://localhost:1337/blah/blah/blah 
+0

Gracias, UriBuilder es genial, y me gusta el método de extensión, por lo que +1. Voy a marcar la respuesta de jglouie aunque viendo como fue primero – Dyppl

+0

En mi opinión, usar una extensión aquí no es bueno. No se espera que el usuario proporcione un método SetPort, donde debe obtener el Uri devuelto. Para mí, solo tiene sentido usarlo así: uri.SetPort (1337); – duedl0r

Cuestiones relacionadas