2009-12-24 10 views
6

Recientemente he visto un servicio WCF que declara contratos de operación con por ref argumentos.¿Los argumentos 'por ref' en WCF son incorrectos o buenos?

No sé por qué se tomó esta decisión de diseño (las operaciones son nulas), pero además, no puedo, desde mi conocimiento de WCF, decir si esta es una buena práctica o no. O si esto no es relevante.

¿Qué opinas?

Respuesta

4

WCF es no un método de "llamada de objeto remoto" o algo así, es puro paso de mensajes. Por lo tanto, es posible que se haya compilado un parámetro "by-ref", pero realmente no va a hacer nada útil.

En su cliente, tiene un método con los parámetros que usted llama. El tiempo de ejecución de WCF luego intercepta esa llamada, empaqueta los parámetros y cualquier información adicional necesaria en un mensaje, serializa ese mensaje (en XML textual o binario) y envía ese mensaje a través del cable al servidor.

El servidor deserializa los mensajes en un conjunto de parámetros, y el componente despachador en el servidor creará una instancia de la clase de servicio y llamará al método apropiado en esa instancia de clase de servicio con los parámetros del mensaje.

Toda la historia funciona al revés para la respuesta que el servidor envía de vuelta.

Pero nuevamente: todo lo que intercambia entre el cliente y el servidor es un mensaje serializado - no tiene sentido hacer un parámetro "por ref" - al final no puede ser un parámetro de ref. El servidor y el cliente son mundos totalmente separados, objetos y clases totalmente separados: se ven iguales en el cable.

Creo que quien escribió que el método WCF no entendía los principios de la aprobación de mensajes WCF, pero se sintió atraído por la forma en que se siente WCF, como una simple llamada a un método. Pero en realidad no es solo una llamada al método al final.

+4

Esto es exactamente lo que pensaba. Y después de su respuesta, decidí ejecutar una prueba. Suena extraño, pero la infraestructura WCF maneja el por ref: si el servicio realiza cambios en el argumento ref, después de que la llamada retorna al cliente, el argumento pasado refleja esos cambios. – MatteoSp

+0

@MatteoSp: ¡eso es muy interesante de escuchar! Ni siquiera me molesté en intentarlo, ya que, por lo que sabía, estaba convencido de que nunca funcionaría, ¡mejor pruébelo yo mismo! :-) Aún plantea la pregunta si realmente es una buena idea, aunque ... –

+3

@marc_s Un poco tarde, pero el valor predeterminado de WCF es el estilo RPC. Después de todo, estamos llamando a un método en un objeto (proxy) y, por arte de magia, el método se ejecuta en un servidor. Para usar el estilo de 'mensajes', necesitamos usar contratos de mensajes que nos den un control total del mensaje SOAP. – thewpfguy

5

Sin embargo, según este artículo a Microsoft una WCF llamada se comporta exactamente igual que una llamada a procedimiento remoto y argumentos ByRef se puede utilizar para devolver datos: -

http://msdn.microsoft.com/en-us/library/ms733070.aspx

, consultar la sección: parámetros OUT e Ref

en la mayoría de los casos, se puede utilizar en los parámetros (ByVal en Visual Basic) y parámetros out y ref (ByRef en Visual Basic). Debido a que ambos parámetros, out y ref, indican que los datos se devuelven desde una operación, una firma de operación como la siguiente especifica que se requiere una operación de solicitud/respuesta aunque la operación devuelva la firma vacía.

1

estoy con marc_s.

tiene que tener mucho cuidado.

WCF siempre asignará una nueva instancia de ese objeto, no solo cambiará su contenido.

As mars_s ya explicado wcf es un marco de mensajería. Su naturaleza es enviar y recibir mensajes independientes.

Creo que una buena práctica es definir siempre un mensaje de entrada y salida. Su interfaz de sericve será más fácil de entender y mantener.

métodos con parámetros de ref y out siempre tienden a ser muy feos y difíciles de entender.

Cuestiones relacionadas