如何向校验ReportReady标识的HttpListener发送BinaryFormatter序列化对象请求
问题根因
第三方HttpListener的请求体解析逻辑要求请求数据按照固定结构传输:
- 请求体开头必须是
|ReportReady|格式的标识串 - 标识串之后才是
BinaryFormatter序列化的Foo对象二进制内容
你当前的代码只发送了序列化后的Foo对象,没有添加要求的前缀标识,所以无法通过校验。另外你的序列化代码存在流指针未重置的问题,会导致实际发送的内容为空。
解决方案
修改请求构造逻辑,按照要求拼接前缀和序列化内容,示例代码如下:
Foo objFoo = new Foo(); // 构造要求的前缀 string prefix = "|ReportReady|"; byte[] prefixBytes = Encoding.UTF8.GetBytes(prefix); // 序列化Foo对象 MemoryStream memmoryStream = new MemoryStream(); BinaryFormatter binayformator = new BinaryFormatter(); binayformator.Serialize(memmoryStream, objFoo); // 重置序列化流的指针到开头,否则读不到内容 memmoryStream.Position = 0; byte[] fooBytes = memmoryStream.ToArray(); // 构造请求 HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(uri); request.Method = Method; // 指定编码和内容长度 request.ContentEncoding = Encoding.UTF8; request.ContentLength = prefixBytes.Length + fooBytes.Length; // 写入请求流:先写前缀,再写序列化内容 Stream reqStream = request.GetRequestStream(); reqStream.Write(prefixBytes, 0, prefixBytes.Length); reqStream.Write(fooBytes, 0, fooBytes.Length); reqStream.Close(); // 接收响应 using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) { // 你的响应处理逻辑 }
补充说明
如果测试后仍然无法通过校验,可以检查以下两点:
- 确认第三方解析前缀使用的编码是否为UTF8,若为其他编码(如GB2312)需要同步修改前缀的编码方式
- 确认
Foo类在本地和第三方SDK中的定义完全一致(包括命名空间、字段顺序、Serializable特性等),否则会导致反序列化失败
内容的提问来源于stack exchange,提问作者Afnan Ahmad
相关产品推荐
相关产品推荐

