2011-08-26 20 views
5

Estoy subcscribiendo al servicio web SSRS de SQL Server 2008 (.../reportserver/ReportService2005.asmx? Wsdl) usando WCF, con opciones predeterminadas de configuración WCF hasta donde yo sé.¿Por qué WCF generó proxy envuelve los métodos de interfaz de contrato con nuevos métodos con firmas diferentes?

Aunque hace algo raro cuando genera las clases proxy locales.

Voy a usar el método ListChildren como ejemplo:

En el lado del cliente, WCF genera una interfaz de este tipo, como era de esperar:

public interface ReportingService2005Soap { 

    ListChildrenResponse ListChildren(ListChildrenRequest request); 

} 

También genera un 'cliente' proxy que implementa esa interfaz:

public partial class ReportingService2005SoapClient : 
    System.ServiceModel.ClientBase<ReportingService2005Soap>, ReportingService2005Soap 
{ 

    [EditorBrowsableAttribute(EditorBrowsableState.Advanced)] 
    ListChildrenResponse ReportingService2005Soap.ListChildren(ListChildrenRequest request) 
    { 
     return base.Channel.ListChildren(request); 
    } 

    public ServerInfoHeader ListChildren(string Item, bool Recursive, out CatalogItem[] CatalogItems) { 
     ListChildrenRequest inValue = new ListChildrenRequest(); 
     inValue.Item = Item; 
     inValue.Recursive = Recursive; 
     ListChildrenResponse retVal = ((ReportingService2005Soap)(this)).ListChildren(inValue); 
     CatalogItems = retVal.CatalogItems; 
     return retVal.ServerInfoHeader; 
    } 

} 

Como se puede ver, el proxy cliente implementa la interfaz y luego 'oculta' que sea utilizado por la implementación explícitamente la interfaz (por lo que debe lanzar para llegar al método de interfaz) y adicionalmente con un atributo EditorBrowsableState.Advanced.

Luego agrega un método de envoltura adicional que usa parámetros 'fuera'.

¿Hay alguna manera de detener esto y hacer que implemente la interfaz directamente?

Lo que está haciendo aquí lo lleva por el camino de usar los métodos de contenedor con parámetros de 'salida', y luego encuentra que no puede simular el servicio muy fácilmente porque los métodos de contenedor no son virtuales y no son definido en cualquier interfaz.

NB: Estoy utilizando el servicio web SSRS como ejemplo aquí, pero he visto que WCF también lo hace en otros servicios.

+0

¿Qué sucede si va a la configuración avanzada de Agregar referencia de servicio y marca 'Siempre generar contratos de mensajes'? –

+0

@Ladislav: ah sí, eso parece arreglarlo. Si publica una respuesta, puedo votar, gracias. – codeulike

+0

Mi pregunta recibió una insignia de "pregunta popular" (1000 visitas) pero no un voto único. Debería obtener una insignia anti para eso: S – codeulike

Respuesta

6

Esto probablemente ocurra si su servicio está usando MessageContract s. La creación de proxy de forma predeterminada intenta desenvolver estos contratos de mensaje para que las operaciones expuestas acepten su contenido directamente. Si también desea usar contratos de mensajes en el cliente, debe configurarlo en la configuración avanzada de Agregar la referencia de servicio marcando Generar siempre contratos de mensajes.

+0

Gracias, había pasado por alto esa opción hasta ahora. Si se llamó '* Nunca generar métodos de envoltura de basura *' Podría haberlo intentado:) – codeulike

Cuestiones relacionadas