2010-09-09 15 views
8
 [OperationContract] 
    [WebGet(UriTemplate = "/searchresults/{searchTerm}/{searchType}", ResponseFormat = WebMessageFormat.Xml, RequestFormat = WebMessageFormat.Xml, BodyStyle = WebMessageBodyStyle.Bare)] 
    Message GetSearchResults(string searchTerm, string searchType); 

    [OperationContract] 
    [WebGet(UriTemplate = "/searchresults/{searchTerm}", ResponseFormat = WebMessageFormat.Xml, RequestFormat = WebMessageFormat.Xml, BodyStyle = WebMessageBodyStyle.Bare)] 
    Message GetSearchResults(string searchTerm); 

¿Es esto posible? Si no, ¿alguien puede sugerir una alternativa?¿Es posible tener uritemplates "sobrecargados"?

Respuesta

9

he encontrado que esta era la mejor solución para mí:

[OperationContract(Name = "SearchresultsWithSearchType")] 
    [WebGet(UriTemplate = "/searchresults/{searchTerm}/{searchType=null}", 
    ResponseFormat = WebMessageFormat.Xml)] 
    Message GetSearchResults(string searchTerm, string searchType); 


    [OperationContract(Name = "SearchresultsWithoutSearchType")] 
    [WebGet(UriTemplate = "/searchresults/{searchTerm}", 
    ResponseFormat = WebMessageFormat.Xml)] 
    Message GetSearchResults(string searchTerm); 

esto coincide:

"http://myservice/searchresults/mysearchterm"

"http://myservice/searchresults/mysearchterm/"

"http://myservice/searchresults/mysearchterm/mysearchtype"

+0

¿Esto realmente funciona para ti? WCF generalmente no permite dos operaciones con el mismo nombre. –

+0

me funcionó - la propiedad 'Name' del atributo' OperationContract' diferencia los dos. Sin embargo, los métodos subyacentes aún necesitan firmas diferentes. – northben

1

No, en realidad, porque el parámetro de cadena searchType puede ser NULO, por lo que realmente no tiene forma de distinguir las dos plantillas de URL. Sería diferente si estuviese usando un tipo que no admite nulos, como un INT o algo así, entonces usted (y el tiempo de ejecución de .NET) podrían mantener las dos plantillas de URL separadas (en función del hecho de si el INT está presente).

Lo que debe hacer es verificar si searchType está vacío o NULO en su método GetSearchResults, y actuar en consecuencia.

[OperationContract] 
[WebGet(UriTemplate = "/searchresults/{searchTerm}/{searchType}", ResponseFormat = WebMessageFormat.Xml, RequestFormat = WebMessageFormat.Xml, BodyStyle = WebMessageBodyStyle.Bare)] 
Message GetSearchResults(string searchTerm, string searchType); 

y en su aplicación:

public Message GetSearchResults(string searchTerm, string searchType) 
{ 
    if(!string.IsNullOrEmpty(searchType)) 
    { 
     // search with searchType 
    } 
    else 
    { 
     // search without searchType 
    } 
    ...... 
} 
+0

Gracias - mi problema es: "http: // myservice/searchresults/searchTerm" o "http: // myservice/searchresults/término de búsqueda /", es decir sin la searchType parte de la URL no coincidirá con la plantilla anterior y devuelve un 404. ¿Debo configurar de manera predeterminada el parámetro searchType? – Pones

+1

@pones: ok - hmm ... Tenía la impresión de que coincidiría con esa plantilla. Pero parece que necesitas las dos plantillas de URI después de todo. ¡Gracias por compartir tus ideas! –

0

que logra esto mediante el uso STREAM para pasar datos desde el cliente. Incluso puede tener 2 operaciones con el mismo nombre pero diferente nombre de método. desde el extremo frontal Asegúrese de ajustar contentType como "text/javascript" O "application/octet-stream", e intente enviar datos mientras que el puesto de HTML o en variabke datos si el uso de AJAX o jQuery

Por ejemplo [ OperationContract] [WebInvoke (Method = "PUT", UriTemplate = "user/id/{id} /", ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped)] string UpdateUser (string id , Secuencia System.IO.Stream);

[OperationContract] [WebInvoke (Método = "BORRADO" UriTemplate = "usuario/id/{id} /", ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json, bodystyle = WebMessageBodyStyle.Wrapped)] string DeleteUser (string id);

o PUT y DELETE sustituto para GET y POST

Cuestiones relacionadas