Question

Dans un contexte de service Web, la classe suivante hérite de la classe Mammal. La classe Mammal est définie dans un proxy. Je ne peux pas changer la définition de cette classe. Parce que j’ai besoin d’ajouter des méthodes à la classe Mammal côté client, j’ai hérité de Mammal et créé Giraffe.

namespace TestApplication
{  
    public class Giraffe : Mammal
    {
        public Giraffe()
        {
        }
    }
}

Lorsque j'appelle un WebMethod qui attend un objet de type Mammal, je reçois l'exception suivante me disant que Giraffe n'est pas attendu.

  Error: System.InvalidOperationException: There was an error generating the XML document. ---> System.InvalidOperationException: The type Giraffe was not expected. Use the XmlInclude or SoapInclude attribute to specify types that are not known statically.
   at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterPaymentRequestAuthorization.Write6_Tender(String n, String ns, Tender o, Boolean isNullable, Boolean needType)
   at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterPaymentRequestAuthorization.Write12_PaymentRequestAuthorization(String n, String ns, PaymentRequestAuthorization o, Boolean isNullable, Boolean needType)
   at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterPaymentRequestAuthorization.Write13_PaymentRequestAuthorization(Object o)
   --- End of inner exception stack trace ---

Existe-t-il une solution de contournement? Je ne peux pas vraiment ajouter le XmlInclude ...

Était-ce utile?

La solution

Pour ajouter des méthodes, vous devez utiliser des classes partielles. Essayez d’ajouter un deuxième fichier de classe avec (dans le bon espace de noms, etc.):

partial class Mammal {
    public void ExtraMethod() {...}
}

Le mot clé partial indique au compilateur de permettre à la classe d'être divisée en plusieurs fichiers - idéal pour les scénarios de génération de code. Cependant, il exige le mot clé partial dans chaque fichier; les membres sont simplement combinés (à l'exception des méthodes partielles dans C # 3.0 qui ont leur propre comportement subtil). J'espère espérer que wsdl.exe (ou quoi que ce soit) inclut cela!

Autres conseils

Si vous souhaitez simplement ajouter des méthodes à une classe que vous ne pouvez pas modifier, créez simplement des méthodes d'extension.

public static class MammalExt {
public static void ExtraMethod(this Mammal mammal) {...}}

Bien que si mammal soit une classe générée par proxy, elle devrait être une classe partielle.

Vous devez utiliser XmlInclude. C'est ton seul choix. Vous devez indiquer au sérialiseur la classe que vous allez sérialiser, car il doit générer le code pour effectuer la sérialisation.

En écrivant ceci, je suis frappé de constater que Giraffe peut implémenter IXmlSerializable, mais cela demande encore plus de travail.

La bonne réponse est en effet d’utiliser une classe partielle. Lorsque vous ouvrez le projet client et générez une référence Web, Visual Studio analyse le WSDL et génère une classe appelée Mammal . Cette classe n'est visible que par le projet client, vous n'avez donc pas à vous soucier du côté serveur.

Disons que vous avez une référence Web appelée MyWebService. Ensuite, il y aura une classe appelée MyWebService.Mammal . Pour ajouter des membres à cette classe, il vous suffit de créer un nouveau fichier source contenant ceci:

namespace MyWebService {
    public partial class Mammal {
        public void ExtraMethod() { ... }
    }
}

Lorsque vous appelez une méthode sur votre service Web qui retourne un Mammal , le code de référence Web crée une nouvelle instance de votre " amélioré ". Classe Mammal, puis copiez les valeurs du XML sur le fil vers l'instance.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top