Question

Je fais un tour depuis un certain temps maintenant et je ne peux pas comprendre pourquoi je peux utiliser la configuration pour ajouter des références aux types connus, ou comment le déboguer. Tous les pointeurs pourraient sauver ma santé mentale.

J'ai un service WCF hébergé dans un service Windows, et j'ai un fichier de configuration pour le service. Dans la configuration, j'ai ceci:

<configuration>
...
  <system.runtime.serialization>
    <dataContractSerializer>
      <declaredTypes>
        <add type="My.Full.Interface.Name, My.Assembly.Name.With.No.dll">
          <knownType type="My.Full.Implementation.Class.Name, My.Assembly.Name.With.No.dll"/>              
        </add>
      </declaredTypes>
    </dataContractSerializer>
  </system.runtime.serialization>
...
</configuration>

J'ai essayé d'ajouter le Version=1.0.0.0,Culture=neutral,PublicKeyToken=null Aux deux déclarations, mais je n'arrive pas à faire en sorte que le sérialisateur de contrat de données les ramasse.

J'ai vérifié que cette classe peut être retournée (en ajoutant un [ServiceKnownType(typeof(My.Implementation.Class))]) Et cela fonctionne, mais j'ai une autre implémentation que je veux utiliser qui se trouve dans un assemblage qui créerait une référence circulaire si je l'aijoutais, donc je ne peux pas l'utiliser.

Comment puis-je déboguer pourquoi le sérialiseur de distribution de données ne trouve pas mon type? Ou quel est le problème avec ma déclaration?

Était-ce utile?

La solution 2

Il semble donc que mon problème était que mon type de base est une interafésie, et comme les attributs Knownype ne peuvent être appliqués qu'aux classes, c'est pourquoi cela ne fonctionnait pas.

J'ai pu le contourner en utilisant la suggestion dans Cette réponse

 [ServiceKnownType ("GetKnownTypes", typeof (KnownTypesProvider))] 

Sur le service Inteface, puis fournir une classe et une méthode pour fournir les types:

internal static class KnownTypesProvider
    {
    public static IEnumerable<Type> GetKnownTypes (ICustomAttributeProvider provider)
        {            
        return new[] {Type.GetType ("Assembly qualified type name")};
        }
    } 

ce qui a également permis la résolution des types qui se trouvent dans différents assemblages. Pendant que cela fonctionne, ce n'est pas génial, donc je finirai probablement par aller à une solution qui utilise la configuration comme dans ce réponse, ou en ajoutant l'attribut SOEM à mes classes et en l'utilisant pour identifier les types connus.

Autres conseils

Si vous cherchez un moyen de déboguer votre service Windows, vous pouvez essayer d'ajouter la ligne System.Diagnostics.Debugger.Break(); Au startup de service. Je ne sais pas si cela est suffisamment tôt pour découvrir pourquoi l'infrastructure de sérialisation ne ramasse pas votre DatacontractSerializer.

Je ne vois aucune erreur dans le <system.runtime.serialization> élément que vous avez publié. Avez-vous enquêté sur le reste du fichier EXE.Config pour les erreurs sémantiques?

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