我编写了一个使用 servicestack 的服务器,以及一个使用 JSON 和 protobuf-net 连接到它的客户端(所以我确信服务器可以工作......)。现在我需要使用 CF3.5 在 Windows Mobile 上开发相同的客户端,并且由于 CF3.5 不支持 servicestack,因此我在客户端 HttpWebRequest 和 NewtonSoft.Json.Compact 上使用了 json 部分,这样:
课程:
[ProtoContract]
public class ReqPing 
{
}
[ProtoContract]
public class RespPing
{
    [ProtoMember(1)]
    public string Result { get; set; }
}
功能:
ReqPing iReqPing = new ReqPing();
string json = JsonConvert.SerializeObject(iReqPing);
HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://192.168.0.87:82/json/syncreply/ReqPing");
req.ContentType = "text/json";
req.Method = "POST";
req.ContentLength = json.Length;
            using (var streamWriter = new StreamWriter(req.GetRequestStream()))
            {
                streamWriter.Write(json);
                streamWriter.Flush();
                streamWriter.Close();
            }
            HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
            Stream respStream = resp.GetResponseStream();
            string resps;
            using (var reader = new StreamReader(respStream, Encoding.UTF8))
            {
                resps = reader.ReadToEnd();                
            }
            respStream.Close();
            JsonTextReader jreader = new JsonTextReader(new StringReader(resps));
            JsonSerializer serializer = new JsonSerializer();
            RespPing iRespPing = serializer.Deserialize<RespPing>(jreader);
它有效,所以现在我正在尝试用 protobuf 实现相同的功能,但我被困在这里:
ReqPing iReqPing = new ReqPing();
var ms = new MemoryStream();?????? correct way?
Serializer.Serialize<ReqPing>(ms, iReqPing);
HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://192.168.0.87:82/x-protobuf/reply/ReqPing");
            req.ContentType = "application/x-protobuf";
            req.Method = "POST";
            req.ContentLength = ????????
how can I write the serialized stream to req??               
            HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
            Stream respStream = resp.GetResponseStream();
            RespPing iRespPing = Serializer.Deserialize<RespPing>(respStream);
任何人都可以建议我什么是正确的方法?
谢谢!马蒂亚
编辑:
好的,关于如何使用流,但我也需要设置 ContentLength,否则我在 GetRequestStream 上收到错误消息(说我必须设置 ContentLength ...)。我使它与:
byte[] data;
        using(var stream = new MemoryStream()) 
        {
            Serializer.Serialize(stream, iReqPing);
            data = stream.ToArray();
            req.ContentLength = data.Length;
        }
        using(var stream = req.GetRequestStream()) 
        {
            stream.Write(data, 0, data.Length);                
        }
我还有另一种明显的方式吗?
另一个问题:我让它工作,但在两次请求之后,第三次它在 GetRequestStream 中超时。我注意到我在之前的调用中忘记了在我的 HttpWebResponse 中调用 Close(),我更正了它,现在可以工作了。奇怪的是,即使使用 JSON 版本,我也忘记关闭 HttpWebResponse,而且我没有遇到任何问题......例程完全一样......你能猜到原因吗?再次感谢!