Question

L'ajout d'une référence de service à un service Web (il s'agit uniquement de WCF) dans Visual Studio génère du code généré, notamment un retraitement côté client de l'interface exposée.

Je comprends pourquoi cette interface est générée: vous utilisez peut-être un service tiers et n’avez pas accès à l’interface réelle.

Mais moi, et les deux ne sont pas compatibles, même si le proxy transparent implémente exactement l'interface vers laquelle je souhaite lancer le casting.

Je peux utiliser la réflexion, mais c'est moche. Existe-t-il un moyen de vaincre cette sécurité de type faux et d’injecter des métadonnées afin que je puisse utiliser une interface avec une classe?

Mon problème spécifique s’éloigne de la norme de manière complexe, en ce qui concerne un client unique qui utilise directement certains dérivés d’une classe de base et en utilise d’autres à distance via des références de service. La classe de base de chaque serveur doit conserver les références aux clients abonnés dans une collection pour l'énumération afin de notifier les événements. Le problème a été modifié en raison de l'utilisation de serveurs proxy.

Aucune de ces réponses ne résout mon problème spécifique, pourtant chaque réponse était instructive et utile. J'ai trouvé ma propre solution (utiliser une double liaison) mais je ne l'aurais jamais trouvée si vous n'aviez pas radicalement amélioré ma compréhension de l'entreprise.

Trois excellentes réponses. Comment choisir un seul? Je choisis le premier, car cela résout directement le problème que j’avais pensé au préalable.

Était-ce utile?

La solution

Lorsque vous ajoutez la référence de service, accédez à " Avancé " et assurez-vous que " Réutilisez les types dans les assemblys référencés " est sélectionné et que l'assemblage contenant votre définition d'interface est sélectionné. Vous pouvez également le faire avec une référence de service existante en cliquant dessus avec le bouton droit de la souris et en accédant à & Quot; Configurer & Quot;.

.

Autres conseils

Si vous avez déjà la dll contract chez le client, vous n'avez même pas besoin d'une référence de service (à moins que vous ne l'utilisiez pour écrire le code d'installation pour vous). Vous pouvez simplement sous-classer ClientBase et exposer le canal, et utiliser cela directement - quelque chose comme (pas d'IDE à portée de main ...):

public class WcfClient<T> : ClientBase<T> where T : class
{
    public new T Channel {get {return base.Channel;}}
}

Ensuite, vous pouvez simplement faire des choses comme:

using(var client = new WcfClient<IFoo>())
{
    client.Channel.Bar(); // defined by IFoo
}

Vous avez toujours besoin des paramètres de configuration dans la configuration pour déterminer l'adresse, la liaison, etc. - mais moins de confusion que la génération de proxy. Vous pouvez également choisir de réimplémenter IDipsoable pour tenir compte du fait que les mandataires WCF peuvent ajouter Dispose() (ce qui est mauvais):

public class WcfClient<T> : ClientBase<T>, IDisposable where T : class
{
    public new T Channel {get {return base.Channel;}}
    void IDisposable.Dispose() {
        try {
           switch(State) {
              case CommunicationState.Open: Close(); break;
              // etc
           }
        } catch {} // swallow it down (perhaps log it first)
    }
}

Pour renvoyer une interface d'un service, vous devez utiliser l'attribut KnownType:

Est-ce que cela vous aide?

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