Protobuf-net Comment consommer un service WCF dans NET client CF?
-
19-09-2019 - |
Question
Je suis en train de consommer un WebService WCF en utilisant les capacités RPC du Protobuf-net. Voici mon contrat de service:
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 le webservice:
class Program
{
static void Main(string[] args)
{
EchoServiceClient client = new EchoServiceClient();
Console.WriteLine(client.EchoNull());
}
}
Je continue à recevoir une exception avec le message suivant:
Soit ContentLength doit être réglé à un nombre non négatif, ou SendChunked à true afin d'effectuer l'opération d'écriture lorsque AllowWriteStreamBuffering est désactivé.
Pour autant que je peux dire après avoir creusé dans le code source de protobuf net le problème semble être qu'il n'y a pas de contenu-longueur spécifiée. Est-il une autre façon de consommer webservices WCF en utilisant la sérialisation protobuf-net dans .NET CF ou un moyen de résoudre ce problème?
Marc vous êtes sur:)
La solution
Edit: J'ai mal lu la question; version courte: ProtoClient = WCF. Ils ne sont pas compatibles.
Compact Framework souffre que la pile de WCF n'a pas tous les points d'extension nécessaires à cet effet; Bref, vous ne pouvez pas utiliser cette approche avec WCF + CF.
Je suis au courant des différentes approches de travail pour protobuf net avec CF, bien;
- a votre service un retour
byte[]
ou (mieux)Stream
et de gérer manuellement; non, ce n'est pas assez, mais cela fonctionne - vous pouvez essayer la pile RPC alternatif inclus avec protobuf-net; I pense 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 CF, et je ne suis pas en mesure de vérifier au moment. il devrait sur le travail des FC, comme je me souviens d'avoir à re-mettre en œuvre Expression
pour le compiler ... une exemple d'utilisation (pour les deux 2.0 style et 3,5 style) sont ici .