2011-08-24 22 views
7

Tengo un servicio REST WCF que tiene un método que obtiene un parámetro como una cadena. Esta cadena puede contener barra/carácter. Hace que mi solicitud sea incorrecta, ya que creo que la URL no funciona.¿Cómo puedo pasar la barra diagonal y otros caracteres 'url sensitive' a un servicio WCF REST?

Al solicitarlo y recibir respuesta (WebRequest.GetResponse()) arroja "El servidor remoto devuelve un error: (400) Solicitud incorrecta". excepción.

Mi solicitud: http://localhost:17679/testmethod/DmC/TCGlOLz1EbEwqAls5Q== \ nh2cQzTizSBg =

He intentado utilizar Uri.EscapeDataString, pero no ayuda, me da la misma excepción que el anterior. Después de esta conversión mi solicitud es así: http://localhost:17679/testmethod/DmC%2FTCGlOLz1EbEwqAls5Q%3D%3D%0Ah2cQzTizSBg%3D

Si paso una cadena sin raya vertical en la cadena funciona como yo quiero.

¿Cómo puedo pasar la barra oblicua y otros caracteres 'url sensitive' a un servicio WCF REST?

Thx.

ACTUALIZACIÓN: Lo resolví, puedes verlo en mi respuesta a continuación.

+0

¿Por qué es eso inaceptable? ¿No es decodificado por WCF? Si es así, ¿qué ve tu función? ¿Se lanza una excepción? ¿Estableció includeExceptionDetailInFault como se describe en [este documento] (http://msdn.microsoft.com/en-us/library/ff649234.aspx). –

+0

Entonces, el "El servidor remoto devolvió un error: (400) Solicitud incorrecta". se produce una excepción cuando se llama al método GetResponse de WebRequest. – Tom

+0

Su pregunta no dejó en claro que al pasar el texto escapado también devolvió el error 400. Por favor edítalo. –

Respuesta

7

Lo he resuelto.

La plantilla de URI es la clave.

Si defino URI de esta manera, se produce la excepción anterior:

[OperationContract()] 
    [WebGet(UriTemplate = "/testmethod/{testvalue}"/*, BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Xml*/)] 
    string TestMethod(string testvalue); 

Mediante la modificación de esta manera, funciona:

[OperationContract()] 
    [WebGet(UriTemplate = "/testmethod?v={testvalue}"/*, BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Xml*/)] 
    string TestMethod(string testvalue); 

De todos modos, Uri.EscapeDataString se necesita!

-2

Intenta forcing a \ before each /. (normalmente obliga a los metacaracteres a leerse como un carácter normal)

+0

No funciona, eso fue lo primero que intenté. ¡Gracias! – Tom

+0

bien, perdón por la respuesta fácil que traté de dar – Stefano

0

Si bien la respuesta aceptada funcionará en algunos casos, donde el parámetro URI se encuentra al final del URI, no funcionará si un parámetro URI está en el medio de un URI. Pero con solo unos pocos ajustes de configuración, puede permitir que su aplicación acepte barras diagonales codificadas.

El HttpListener que toma solicitudes entrantes utiliza un HttpListenerRequestUriBuilder interno para analizar el URI de solicitud sin formato.

El HttpListenerRequestUriBuilder quitará o no la codificación en función de una configuración. Añadir la siguiente configuración en el archivo de app.config:

<configuration> 
    <system.net> 
    <settings> 
     <httpListener unescapeRequestUrl="false"/> 
    </settings> 
    </system.net> 
</configuration> 

Esto permitirá que los entrantes Message 's To cabeceras que se construirán correctamente sin representación no literal de las URIs.

Si está utilizando una versión de .NET 4.5 antes, creo que también puede ser necesario añadir otro ajuste instruir a la clase System.Uri a no escapar de barras para http y https caminos.Esta configuración es la siguiente:

<configuration> 
    <uri> 
    <schemeSettings> 
     <add name="http" genericUriParserOptions="DontUnescapePathDotsAndSlashes"/> 
     <add name="https" genericUriParserOptions="DontUnescapePathDotsAndSlashes"/> 
    </schemeSettings> 
    </uri> 
</configuration> 

Uri.Match y el valor predeterminado QueryStringConverter debería funcionar con el texto sin escapar, por lo que un método como:

[WebGet(UriTemplate = "foos/{bar}/baz"] 
public Baz GetFooBaz(string bar) 
{ 
    // ... 
} 

proporcionará una cadena sin escapar al parámetro bar.

Cuestiones relacionadas