2009-03-12 15 views
6

He creado una clase SoapExtension para capturar la solicitud de jabón y la respuesta de llamadas de servicio web específicas. Para poner en vigencia esta SoapExtension, debo agregar un atributo al método en el cliente proxy generado.Cómo agregar el atributo SoapExtension al proxy del cliente del servicio web generado sin modificar la clase generada?

Por ejemplo, he añadido el atributo AuditSoapCapture a este método:

[System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://blahblah.com/webservices/AddressSearch", RequestNamespace = "http://blahblah.com/webservices/", ResponseNamespace = "http://blahblah.com/webservices/", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] 
    [blahblah.TriadLite.Core.AuditSoapCapture] 
    public System.Data.DataSet AddressSearch(string HouseNumber, string StreetName, string ZipCode) { 
     object[] results = this.Invoke("AddressSearch", new object[] { 
        HouseNumber, 
        StreetName, 
        ZipCode}); 
     return ((System.Data.DataSet)(results[0])); 
    } 

Busco una forma de añadir este atributo a métodos específicos, sin modificar el proxy cliente generado, ya que se pierdan cuando nos regeneramos ¿Puedo hacer esto en otra clase o interfaz parcial o de alguna otra manera?

Gracias!

+0

tratar de utilizar la infraestructura [SchemaImporterExtension] (http://msdn.microsoft.com/en-us/library/system.xml.serialization.advanced.schemaimporterextension.aspx) llamando a wsdl.exe con la opción '/ parameters' (http://msdn.microsoft.com/en-us/library/7h3ystb6.aspx) – Lu55

Respuesta

1

Lamentablemente, tendrá que modificar el código del proxy. Las otras posibilidades que mencione no funcionarán: una clase parial no sobrescribirá la funcionalidad existente, y no hay forma de que sepa que tengo una interfaz para hacer lo que necesita (agravado por el hecho de que no hay forma de dejarlo siquiera). el generador de proxy sabe que tiene la intención de implementar una interfaz).

Algo que he hecho en el pasado, en una situación donde tienes acceso a la fuente del servicio web, es escribir una pequeña aplicación que analizará el código (como texto) en el archivo .asmx.cs del servicio web para extraer los nombres de todos los métodos etiquetados con [WebMethod]. Luego, la aplicación "arregla" References.cs insertando los atributos apropiados en los métodos de proxy, basados ​​en algún archivo de configuración o somesuch. Esto funciona bien porque las convenciones de nombres en el proxy representan muy bien los nombres de los métodos en el servicio original.

1

Puedo terminar inyectando mi SoapExtension poniéndolo en Web.config. Esto hará que se ejecute en cada llamada de WS sin un atributo de método proxy de cliente. Luego, modificaré la SoapExtension para buscar el nombre del método WS llamado en una lista, y si está en la lista, entonces haré el resto de la lógica de SoapExtension. Me imagino que el golpe en la lista en esta pequeña aplicación de volumen no va a matar el rendimiento.

-1
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class)] 
public class CriptoExtensionAttribute : SoapExtensionAttribute 

[CriptoExtension] 
public partial class MainService{ 
+1

No funciona para mí – Lu55

1

Hace 6 años esto fue publicado ... Así que no estoy seguro de si esto ayudará a nadie en este punto.

Me encontré con algo similar con una llamada a un antiguo servicio web SOAP que tenía una clase de proxy generada dinámicamente que no queríamos modificar ya que fue generado automáticamente desde el wsdl por el proyecto. Para resolver este problema, aquí está lo que hicimos.

  • La clase de proxy generada por wsdl.exe es una clase parcial. Ampliamos esta clase como para agregar una propiedad con la información a la que queríamos acceder en la extensión soapextension. Puede añadir tantas propiedades como desee ...

    partial class mysoapwebservice { public string myproperty{ get; set; } }

  • en el web.config se registró la extensión de jabón globaly en el proyecto

    <webServices> <soapExtensionTypes> <add type="MySoapExtension" priority="1" group="Low"/> </soapExtensionTypes> </webServices>

  • En el código eran creamos el objeto del servicio web 'mysoapwebservice', establecimos el valor de la propiedad que necesitábamos.

  • En la ampliación de recursos puede obtener una referencia del servicio web que se llamó, así como los valores.También puedes determinar la llamada al método.

`

public class MySoapExtension: SoapExtension 
{ 
    public override void ProcessMessage(SoapMessage message) 
    { 
    switch (message.Stage) 
     { 
      case SoapMessageStage.BeforeSerialize: 
       { 
        // web service client object 
        var webserviceobject= ((SoapClientMessage)message).Client; 
        // method from web service that was called 
        var calledMethod = (SoapClientMessage)message).MethodInfo; 

        // checked the client type of webserviceobject and 
        //added method/property specific logic here 
       } 
     } 
    } 

    // other soap extension code 
} 
Cuestiones relacionadas