Pregunta

Agregar una referencia de servicio a un servicio web (esto es todo WCF) en Visual Studio produce un código generado que incluye una reexpresión del lado del cliente de la interfaz expuesta.

Entiendo por qué se genera esta interfaz: es posible que esté consumiendo un servicio de terceros y no tenga acceso a la interfaz real.

Pero lo hago, y los dos son no compatibles con la asignación a pesar de que el proxy transparente implementa exactamente la interfaz a la que quiero transmitir.

Puedo usar la reflexión, pero eso es feo. ¿Hay alguna forma de vencer esta seguridad de tipo falso e inyectar metadatos para que pueda usar una interfaz con una clase?


Mi problema específico se aparta de la norma en formas complicadas que tienen que ver con un solo cliente que usa algunos derivados de una clase base directamente y usa otros de forma remota a través de referencias de servicio. La clase base para cada servidor necesita mantener referencias a clientes suscritos en una colección para enumerarlos para notificar eventos, y el problema fue de tipo variado debido al uso de proxies.

Ninguna de estas respuestas resuelve mi problema específico, pero cada respuesta fue instructiva y útil. Encontré mi propia solución (use un enlace doble) pero nunca lo habría descubierto si no hubiera mejorado radicalmente mi comprensión de todo el negocio.

Tres excelentes respuestas. ¿Cómo elegir solo uno? Elijo el primero, porque resuelve directamente el problema que primero pensé que tenía.

¿Fue útil?

Solución

Cuando agrega la referencia de servicio, vaya a " Avanzado " y asegúrese de que " Reutilice los tipos en ensamblados referenciados " está seleccionado y que el conjunto que contiene la definición de su interfaz está seleccionado. También puede hacer esto con una referencia de servicio existente haciendo clic derecho sobre ella y yendo a & Quot; Configure & Quot ;.

Otros consejos

Si ya tiene el dll del contrato en el cliente, ni siquiera necesita una referencia de servicio (a menos que lo esté usando para escribir el código de configuración), simplemente puede subclasificar ClientBase y exponer el canal, y usar eso directamente, algo como (sin IDE a mano ...):

public class WcfClient<T> : ClientBase<T> where T : class
{
    public new T Channel {get {return base.Channel;}}
}

Entonces puedes hacer cosas como:

using(var client = new WcfClient<IFoo>())
{
    client.Channel.Bar(); // defined by IFoo
}

Todavía necesita los ajustes de configuración en la configuración para determinar la dirección, el enlace, etc., pero es menos complicado que la generación de proxy. Además, puede optar por volver a implementar IDipsoable para lidiar con el hecho de que los proxies WCF pueden agregar Dispose() (lo cual es malo):

public class WcfClient<T> : ClientBase<T>, IDisposable where T : class
{
    public new T Channel {get {return base.Channel;}}
    void IDisposable.Dispose() {
        try {
           switch(State) {
              case CommunicationState.Open: Close(); break;
              // etc
           }
        } catch {} // swallow it down (perhaps log it first)
    }
}

Para devolver una interfaz de un servicio, debe usar el atributo KnownType:

¿Algo de eso ayuda?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top