Problème d'exposer les types d'interface personnalisés complexes dans les services WCF

StackOverflow https://stackoverflow.com/questions/760270

  •  09-09-2019
  •  | 
  •  

Question

Je suis en train de mettre la main sur un objet d'une autre application en utilisant WCF. Avec construit dans les classes, il fonctionne très bien, mais je tombe probems en essayant de retourner un type d'interface personnalisée de l'opération WCF.

Que j'inclure l'interface dans les deux applications séparément ou SPECIF comme un ensemble partagé, je reçois le même résultat: un CommunicationException avec le message « Il y avait une erreur de lecture de la conduite: 109 Erreur non reconnue ».

L'interface ressemble à ceci:

[ServiceContract]
public interface IBase {
    int IntTest {
        [OperationContract]
        get;
    }
    String StringTest {
        [OperationContract]
        get;
    }
    IOther OtherTest {
        [OperationContract]
        get;
    }
}

[ServiceContract]
public interface IOther {
    String StringTest {
        [OperationContract]
        get;
    }
}

Mon serveur ressemble à ceci:

public partial class MainWindow : Window {
    private Base fb;
    private ServiceHost host;

    public MainWindow() {
        InitializeComponent();
        fb = new Base();
        host = new ServiceHost(fb, new Uri[] { new Uri("net.pipe://localhost") });
        host.AddServiceEndpoint(typeof(IBase), new NetNamedPipeBinding(),
            "PipeReverse");
        host.Open();
    }

    private void Window_Closing(object sender, CancelEventArgs e) {
        host.Close();
    }
}

Et voici mon implémentation de l'interface:

[Serializable]
[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single)]
public class Base : MarshalByRefObject, IBase {
    public int IntTest {
        get { return 4; }
    }

    public string StringTest {
        get { return "A string from Base"; }
    }

    public IOther OtherTest {
        get { return new Other(); }
    }
}

[Serializable]
[DataContract]
public class Other : MarshalByRefObject, IOther {
    [DataMember]
    public string StringTest {
        get { return "A string from Other"; }
    }

}

Le client ressemble à ceci:

public partial class Form1 : Form {

    IBase obj;

    public Form1() {
        InitializeComponent();
        ChannelFactory<IBase> pipeFactory = new ChannelFactory<IBase>(
            new NetNamedPipeBinding(), new EndpointAddress(
            "net.pipe://localhost/PipeReverse"));

        obj = pipeFactory.CreateChannel();
    }


    private void button2_Click(object sender, EventArgs e) {

        Console.WriteLine("Returns: " + obj.StringTest + " " + 
            obj.StringTest.Length);
        Console.WriteLine("Returns: " + obj.IntTest);
        Console.WriteLine(obj.OtherTest);

    }
}

Tout fonctionne comme un charme, sauf cette ligne:

Console.WriteLine(obj.OtherTest);

Il me donne un CommunicationException avec le message « Il y avait une erreur de lecture de la conduite: 109 Erreur non reconnue ». Pour autant que je peux dire que c'est un tuyau cassé en raison d'un état de défaut, mais je ne peux pas comprendre pourquoi, ou plus important encore comment y remédier. Toutes les idées?

Je n'ai pas le fichier de configuration que everthing est fait dans le code ci-dessus, donc je ne sais pas comment activer le suivi, sinon je l'aurais inclus aussi.

Était-ce utile?

La solution

La propriété retour OtherTest doit être un type concret et non une interface, sinon la sérialisation ne fonctionnera pas.

Autres conseils

Ceci est généralement une erreur de sérialisation. Regardez à l'attribut [KnownType]. La meilleure façon de tester ceci est d'invoquer directement DataContractSerializer. Vous pouvez utiliser ses méthodes WriteObject et ReadObject pour obtenir les vraies erreurs de sérialisation. Vous pouvez également inspecter le flux (FileStream habituellement) pour vous assurer que vous tapez sérialise correctement.

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