2011-02-06 14 views
8

Estoy tratando de entender WCF, por lo que mis preguntas pueden ser tontas. Creo que tengo una comprensión firme de las operaciones "OBTENER". Ahora estoy trabajando en algunas operaciones "POST". Mi pregunta es, ¿puedo escribir una operación de servicio WCF, con WebInvoke, que acepta múltiples parámetros? O, cuando publico datos, ¿solo aceptará un solo parámetro serializado?POST Múltiples parámetros para WCF Service

Gracias!

+0

esto huele como una segunda versión de su anterior pregunta :) –

Respuesta

7

Sí, pero su POST deberá transmitirse utilizando un conocimiento común de los datos, también conocido como "contrato de datos".

En WCF, el enfoque típico aquí es que se crearía una clase de contrato (es un ejemplo fuera de mi cabeza, no el 100% de trabajo))

[DataContract(Namespace="http://yournamespace.com")] 
public class MyContract 
{ 
    [DataMember(Order=1)] 
    public string MyData1 { get(); set{};} 

    [DataMember(order=2)] 
    public string MyData2 { get(); set{};} 

} 

entonces lo que especifique su WCF operación para aceptar ese tipo de contrato como su parámetro

[WebInvoke(method="POST")] 
public string DoSomethingFromPost(MyContract postedData) 
{ 
} 

en su cliente, que le serializar los datos a un archivo XML/JSON que coincide con su contrato. Una vez más, suelta ejemplo:

<MyContract xmlns="http://yournamespace.com"> 
<MyData1>value</MyData1> 
<MyData2>value</MyData2> 
</MyContract> 

Cuando coincide con el contrato, WCF deserialze su lugar de destino en el objeto del contrato, momento en el que se puede usar como cualquier otra clase.

+0

Un corchete de cierre no se encuentra en la primera pieza de código de ejemplo –

+0

Thx Carlos, fijo es –

6

Parece que hay un poco de confusión entre WCF (que es el nombre dado a microsofts abstracción general para la programación de la red) y un protocolo específico HTTP, que define los verbos como "POST" y "GET", que WCF estar usando para comunicarse.

Cuando define una operación del servicio wcf y la atribuye con [WebInvoke], tendrá acceso al servicio utilizando REST sobre HTTP. Ver webinvoke para más detalle, sin embargo, las observaciones lo resumen así

El atributo WebInvokeAttribute se aplicado a una operación de servicio en Además de la OperationContractAttribute y asociados la operación con un UriTemplate, así como un subyacente verbo de transporte que representa una invocación (por ejemplo, HTTP POST, PUT o DELETE). El atributo WebInvokeAttribute es un comportamiento de operación pasiva (los métodos IOperationBehavior no hacen nada) que agrega metadatos a la descripción de la operación . Aplicando el atributo WebInvokeAttribute a una operación de servicio no tiene ningún efecto a menos se añade un comportamiento que busca este metadatos en la descripción de la operación (como WebHttpBehavior) a colección de comportamiento del servicio. El WebInvokeAttribute determina a qué método de HTTP responde una operación de servicio . De forma predeterminada, todos los métodos que tienen el atributo WebInvokeAttribute aplicado responden a las solicitudes POST.

Además, en el artículo anterior se define cómo asignar valores a su contrato de servicio. Algo como..

[OperationContract] 
[WebInvoke(Method = "POST", UriTemplate = "Mod?x={x}&y={y}")] 
long Mod(long x, long y); 

EDIT: Para hacer esto un poco más informativo para las personas nuevas en el campo.

+1

ya que Taylor cubrió el cuerpo POST, aquí está el acceso a través del Uri –

+0

+1, buena adición, lo olvidé. Por lo general, evito la POSTING a través de una cadena de consulta sin una buena razón, pero en muchas situaciones esto es igualmente apropiado –

+0

¿Se pueden combinar los dos métodos? p.ej. un método con el URI de Mod? x = {x} & y = {y} que tiene datos de publicación en forma de SomeObject? Entonces, la firma se vería como: largo Mod (largo x, largo y, datos de SomeObject) –