2009-10-13 10 views
1

J'utilise wsdl.exe pour générer automatiquement le code de proxy de service Web à partir d'un fichier wsdl énorme. Je prends ensuite le fichier .cs qu'il génère le compiler en DLL et l'utilise dans mon programme pour faire des appels de service web.Comment générer un code de proxy de service Web avec wsdl.exe qui est sérialisable

Le problème est que lorsque j'utilise l'état de session sql dans mon programme, je ne peux pas enregistrer l'objet proxxy dans l'état de la session. J'ai marqué la classe principale dans le fichier généré wsdl.exe sérialisable, mais cela n'a pas d'importance car il hérite System.Web.Services.Protocols.SoapHttpClientProtocol qui n'est pas sérialisable?

Est-ce que quelqu'un sait d'une façon de faire fonctionner le code généré automatiquement avec l'état de session?

+0

Pourquoi votre application a besoin de sérialisation l'instance proxy lui-même? Puisque c'est un proxy de service Web; n'est-ce pas simplement des méthodes pour retourner des données de manière transactionnelle et peupler une structure de données? La structure de données est-elle vraiment ce que vous voulez sérialiser? – gn22

+0

@Aros, j'ai la même question que Gurdas aussi. Vous essayez de sérialiser l'objet proxy lui-même ou les données qu'il contient? –

Répondre

1

En règle générale, vous devez sérialiser état (entités), pas l'encapsuleur de service WSDL. La plupart du code-gen depuis 2.0 écriront fichiers comme partial les classes, ce qui signifie que vous pouvez ajouter un second fichier de code pour ajouter des choses comme attributs:

namespace MyNamespace 
{ 
    [Serializable] partial class Customer {} 
    [Serializable] partial class Order {} 
    [Serializable] partial class Address {} 
} 

Ceci est combiné avec l'autre moitié dans les types générés wsdl- , et devrait le rendre utilisable de BinaryFormatter - cependant, personnellement Je soupçonne que c'est une mauvaise façon de le faire. Comme vous utilisez wsdl.exe, vos types sont déjà sérialisables via XmlSerializer. Au lieu de les sérialiser avec BinaryFormatter (ce qui est ce qui sera utilisé par défaut, et qui est très fragile), envisager de les sérialiser via XmlSerializer à string ou byte[], et ajouter que à l'état de session. Cela fonctionnera sans changements de code supplémentaires, et est beaucoup plus robuste car il évite les multiples points cassants de BinaryFormatter.

Par exemple:

static string SerializeXml<T>(T obj) where T : class 
{ 
    if (obj == null) return null; 
    StringWriter sw = new StringWriter(); 
    using (XmlWriter xw = XmlWriter.Create(sw)) 
    { 
     new XmlSerializer(typeof(T)) 
      .Serialize(xw, obj); 
    } 
    return sw.ToString(); 
} 
static T DeserializeXml<T>(string xml) where T : class 
{ 
    if (xml == null) return null; 
    using (XmlReader xr = XmlReader.Create(new StringReader(xml))) 
    { 
     return (T)new XmlSerializer(typeof(T)) 
      .Deserialize(xr); 
    } 
} 
+0

Merci pour l'article très détaillé et l'exemple de code, cela m'a mis sur la bonne voie. :) –