2009-07-27 11 views
2

J'essaie de consommer un service web WCF en utilisant les capacités RPC du Protobuf-net. Voici mon contrat de service:Protobuf-net Comment consommer un service WCF dans un client NET CF?

namespace WcfEchoService 
{ 
    // NOTE: If you change the interface name "IService1" here, you must also update the reference to "IService1" in Web.config. 
    [ServiceContract] 
    public interface IEchoService 
    { 

     [OperationContract, ProtoBehavior] 
     string Echo(string value); 

     [OperationContract, ProtoBehavior] 
     string EchoNull(); 

     [OperationContract, ProtoBehavior] 
     CompositeType[] EchoData(CompositeType[] value); 
    } 


    // Use a data contract as illustrated in the sample below to add composite types to service operations. 
    [DataContract] 
    [ProtoContract] 
    public class CompositeType 
    { 


     [ProtoMember(1)] 
     public bool BoolValue 
     { 
      get; 
      set; 
     } 
     [ProtoMember(2)] 
     public string StringValue 
     { 
      get; 
      set; 
     } 
    } 
} 

Et juste au-dessous est mon client .NET CF:

classe EchoServiceClient: ProtoClient, IEchoService {

#region IEchoService Members 

    public EchoServiceClient() : base(new HttpBasicTransport("my service URI")) 
    { 

    } 

    public string Echo(string value) 
    { 
     return (string)this.Invoke("Echo", value); 
    } 

    public string EchoNull() 
    { 
     return (string)this.Invoke("EchoNull"); 
    } 

    public CompositeType[] EchoData(CompositeType[] value) 
    { 
     return (CompositeType[])this.Invoke("EchoData", value); 
    } 

    #endregion 
} 

Et voilà comment j'essaie de consommer la webservice:

class Program 
{ 
    static void Main(string[] args) 
    { 
     EchoServiceClient client = new EchoServiceClient(); 
     Console.WriteLine(client.EchoNull()); 
    } 
} 

Je continue de recevoir une exception avec t Le message suivant:

ContentLength doit être défini sur un nombre non négatif ou SendChunked sur true pour effectuer l'opération d'écriture lorsque AllowWriteStreamBuffering est désactivé.

Autant que je sache après avoir creusé dans le code source de protobuf-net, le problème semble être qu'il n'y a pas de longueur de contenu spécifiée. Existe-t-il un autre moyen de consommer les services Web WCF en utilisant la sérialisation protobuf-net dans .NET CF ou un moyen de résoudre ce problème?

Marc vous êtes sur :)

Répondre

0

Modifier: J'ai mal lu la question; version courte: ProtoClient! = WCF. Ils ne sont pas compatibles. Compact Framework souffre que la pile WCF ne dispose pas de tous les points d'extension nécessaires pour cela; En bref, vous ne pouvez pas utiliser cette approche avec WCF + CF. Cependant, je suis au courant de diverses approches de travail pour protobuf-net avec CF, cependant;

  • ont votre service un retour byte[] ou (mieux) Stream et de gérer manuellement; non, ce n'est pas joli, mais cela fonctionne
  • vous pourriez essayer la pile RPC alternative incluse avec protobuf-net; Je pense que cela fonctionne sur CF (je dois vérifier, si, ma mémoire ne)

La pile alternative est ProtoClient<T>; Honnêtement, je ne me souviens pas si cela fonctionne sur la FC, et je ne suis pas en mesure de vérifier pour le moment. il devrait travailler sur CF, comme je me souviens d'avoir re-implement Expression pour le compiler ... un exemple d'utilisation (à la fois pour le style 2.0 et le style 3.5) sont here.

+0

Merci pour votre réponse. Je vais essayer de jouer et voir ce que je peux faire de cette pile RPC. –

+0

Est-ce que cela inclut WP7? –

+0

@Richard - Je n'ai pas eu beaucoup de temps à regarder WP7, sauf pour faire fonctionner le * core * de v2 (la note v2 est disponible en tant que source, mais n'est pas publiée). En dehors de cela, l'astuce 'byte []' devrait certainement fonctionner et a l'avantage de la simplicité. Il est venu à mon avis plus tôt cette semaine que Silverlight a maintenant quelques-uns des points d'extension précédemment manquants que je pourrais être en mesure d'utiliser pour l'accrocher plus directement, mais je ne sais pas si cela inclut WP7. Hélas, il y a juste un de moi ... –