2010-08-05 14 views
5

¿Cuál de estas dos formas de utilizar el servicio wcf es mejor? ¿por qué?Generación de proxy wcf frente a ChannelFactory

  1. Generación de proxy de Servicio de Referencia
  2. usando ChannelFactory

ex.

ChannelFactory<IMyContract> factory = new ChannelFactory<IMyContract>(); 
IMyContract proxy1 = factory.CreateChannel(); 
proxy1.MyMethod(); 

que es un poco aburrido para llamar al servicio de WCF como so

IMyContract proxy1 = null; 
try 
{ 
    proxy1 = factory.CreateChannel(); 
    proxy1.MyMethod(); 
    ((ICommunicationObject)proxy1).Close(); 
} 
catch 
{ 
    ((ICommunicationObject)proxy1).Abort(); 
} 

¿Hay que repetir este fragmento para cada llamada de proximidad? ¿O hay una manera genérica de crear una clase contenedora para cerrar y abortar proxies?

¿Está escribiendo una clase como esta ServiceExecution.Execute(proxy=>proxy.MyMethod()); que crea un proxy, y lo cierra o aborta de una buena manera de hacer eso?

Respuesta

3

Here es una publicación de MSDN, que recomienda no utilizar proxies generados en .Net 3 porque crea ChanelFactory cada vez, .Net 3.5 ChanelFactory está en caché.

Pero personalmente yo prefiero usar ChanelFactory mí mismo, genera código es siempre un dolor incluso después de partials salen

2

En el primer caso, cuando utiliza VS para agregar la referencia de servicio, genera todo el código para usted, incluidos ServiceContrcats y DataContracts.

Pero cuando usa ChannelFactory debe tener contratos de servicio y etc. en el lado del cliente ya.

+0

lo sé, pero generó contratos de datos no es cómodo de usar. Supongamos que tenemos 2 servicios, el primero devuelve datacontrat que debe pasarse al segundo como parámetro. en este caso, debemos copiar el contrato de datos manualmente, porque el contrato de datos existe en 2 espacios de nombres diferentes –

+0

. Puede editar el código generado por el SV. Y puede tener un DataContract separado. – Incognito

+0

Su edición se perderá después de cualquier cambio en el servicio y la regeneración del proxy no es así? –

2

sugiere emplear el enfoque 1.

he encontrado este blog con un ejemplo incluyendo el código fuente que también explica cómo manejar adecuadamente la conexión (cierre, abortando, etc.). El blog también contiene enlaces para más detalles en MSDN.

+1

El blog explica cómo hacerlo en el primer acercamiento, pero no dice nada en comparación con el segundo. –

+0

@ArsenMkrt: Sí, tienes razón. Agregué un enlace a una entrada de blog que proporciona más información sobre el enfoque que sugerí en mi respuesta. :-) – Manfred

0

Crear manualmente los proxies de servicio de un servicio en ejecución podría ser una buena alternativa. La herramienta svcutil es lo que Visual Studio usa bajo el capó al agregar una referencia de servicio. Al usar esto, puede generar la clase de proxy en una ubicación común, y luego vincularla en cada proyecto que requiera, y también obtener un mejor control sobre sus clases de proxy.

Por ejemplo, para generar un proxy para un servicio llamado TestService que se ejecutan localmente en el puerto 8000, debe ejecutar lo siguiente en el símbolo del sistema de Visual Studio, lo que genera una clase de proxy TestServiceProxy.cs en el directorio de servidores proxy.

cd "C:\src\proxies" 
svcutil /noLogo /out:TestServiceProxy http://localhost:8000/TestService 

hay algunos otros parámetros útiles para la herramienta, por ejemplo:

Añadir /n:*,WcfServices.TestService va a especificar un espacio de nombres para la clase de proxy.

Añadir /config:TestServiceProxy.config y svcutil generará un archivo de configuración de ejemplo para el uso de TestService incluyendo los puntos finales, fijaciones, etc.

Añadir /r:"Common.dll" y la clase de proxy emitida por svcutil no tienen definiciones para los tipos utilizados por el servicio, sino que se define en el conjunto Common.dll.

Use svcutil /? para obtener más información.

+0

'/ config': generará esto de todos modos con un nombre predeterminado output.config. – Rup

+0

No todos los casos comerciales son posibles con la configuración de svcutil, por ejemplo, ¿es posible generar contraseñas de datos en proyectos diferentes, contrato de servicio en diferentes y el proxy en diferentes? no hay, supongo. –

Cuestiones relacionadas