You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何向校验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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 15:54:03