2010-06-03 19 views
44

Estoy desarrollando algunos servicios RESTful en WCF 4.0. Tengo un método de la siguiente manera:Parámetros de cadenas de consulta opcionales en URITemplate en WCF?

[OperationContract] 
    [WebGet(UriTemplate = "Test?format=XML&records={records}", ResponseFormat=WebMessageFormat.Xml)] 
    public string TestXml(string records) 
    { 
     return "Hello XML"; 
    } 

Así que si navego navegador para http://localhost:8000/Service/Test?format=XML&records=10, entonces todo funciona como exepcted.

SIN EMBARGO, deseo poder navegar a http://localhost:8000/Service/Test?format=XML y dejar fuera de la "& records = 10" parte de la URL. Pero ahora, recibo un error de servicio ya que el URI no coincide con la plantilla de URI esperada.

Entonces, ¿cómo implemento los valores predeterminados para algunos de mis parámetros de cadena de consulta? Quiero establecer los "registros" por defecto a 10, por ejemplo, si esa parte se deja fuera de la cadena de consulta.

Respuesta

53

Nota: Esta pregunta no está actualizada, por favor vea las otras respuestas.


Esto no parece ser compatible.

Sin embargo, Microsoft ha hecho consciente de este problema y hay un trabajo en torno a:

usted puede conseguir el efecto deseado por omitiendo la cadena de consulta de la UriTemplate en su WebGet o WebInvoke atributo, y utilizando WebOperationContext.Current.IncomingRequest.UriTemplateMatch.QueryParameters desde dentro de sus controladores para inspeccionar, establecer valores predeterminados, etc. en los parámetros de consulta .

https://connect.microsoft.com/VisualStudio/feedback/details/451296/

+1

Así que parece funcionar bien. Sin embargo, si trato de ejecutar la prueba de unidad en contra de esto, ya no funciona, ya que una prueba de unidad no tiene un WebOperationContext. Busqué algunos ejemplos, pero ¿alguien tiene un ejemplo simple de cómo burlarse del WebOperationContext? – Shafique

+0

Prueba Google "simulando WebOperationContext". Hay muchas ideas diferentes sobre cómo hacer esto. – luksan

+0

¡Dale al hombre un +1, su solución funciona! Aquí, voy a comenzar. – EdgarVerona

4

Comprobar este blog poste hacia fuera. Tiene sentido para mí y viene con una clase para analizar los parámetros de la cadena de consulta.

http://blogs.msdn.com/b/rjacobs/archive/2009/02/10/ambiguous-uritemplates-query-parameters-and-integration-testing.aspx

Básicamente no definen los parámetros de cadena de consulta en el UriTemplate de modo que coincida con/sin los parámetros, y utilice la clase de ejemplo para recuperar si están allí en la implementación del método.

16

De acuerdo con this answer esto se corrigió en .NET 4.0. Si no se proporciona el parámetro de cadena de consulta, parece que se le asigna el valor predeterminado para el tipo.

2

Esto parece funcionar en WCF 4.0.
Sólo asegúrese de establecer su valor por defecto en su "Service1.svc.cs"

public string TestXml(string records) 
{ 
    if (records == null) 
     records = "10"; 

    //... rest of the code 
} 
Cuestiones relacionadas