Usar una barra diagonal inversa (% 5c) en una URL REST WCF

Estoy construyendo un servicio REST en WCF, y uno de los métodos que estoy escribiendo es GetProfile, que devolverá el perfil para un nombre de usuario dado. El nombre de usuario incluirá el dominio del usuario, por lo que tendrá el siguiente formato: "DOMINIO \ nombre de usuario".

Por lo tanto, tengo un servicio llamado Profiles.svc, que tiene la siguiente configuración de punto final:

[OperationContract]
[WebGet(UriTemplate = "/{username}", ResponseFormat = WebMessageFormat.Xml)]
IRestResponse GetProfile(String username);

Sin embargo, cuando intento visitar el servicio en http: //server/profiles.svc/DOMAIN%5cusername (% 5c es la forma url de una barra invertida) Recibo el siguiente error:

Server error in '/' Application
HTTP Error 400 - Bad Request

Esto ocurre incluso cuando no hay un código realmente definido en mi implementación de GetProfile, así que creo que el error se está produciendo en el momento en que WCF intenta vincular el URI a un método.

¿Hay alguna configuración que deba agregar a la configuración de mi servicio web para permitir agregar barras diagonales inversas a las URL en un servicio REST WCF? ¿O las barras invertidas simplemente no están permitidas?

1

1 Respuestas

Sospecho que simplemente no están permitidos en esa parte de la url. Están bien en la cadena de consulta siempre que estén codificados. Como regla general, no pondría nada en la parte de ruta de la url que no sea válido en el nombre del archivo (es decir,?).

Tal vez podrías usar un personaje diferente para delimitar el dominio desde el nombre de usuario.

También podría separar el nombre de usuario en nombre de dominio y nombre de usuario y usar el delimitador de ruta normal '/'. No estoy familiarizado con esto lo suficiente como para saber si así es como lo haces seguro, pero esta sería mi mejor suposición.

[OperationContract]
[WebGet(UriTemplate = "/{domainName}/{username}", ResponseFormat = WebMessageFormat.Xml)]
IRestResponse GetProfile(String domainName, String username);
5
agregado
Buena solución. también tuvimos que omitir la url REST/from out.
agregado el autor Muhammedh, fuente
Esta parece ser la forma correcta de hacerlo (/ {domainName}/{userName}) ya que el dominio y el nombre tienen una relación jerárquica que se expresa bien con REST.
agregado el autor James Bender, fuente