在开发过程中,程序员经常需要将对象从服务器发送到客户端。理想的情况是能够获取整个对象,而不仅仅是部分属性。然而,常见的技术如WCF或Web Services虽然提供了一整套工具,如序列化,但它们往往带来过多的开销和复杂性。本文旨在探讨一种简单、快速且通过基本HTTP协议传输对象的方法。
虽然使用WCF或MTOM等技术可以实现对象的传输,但这些方法对于简单的项目来说过于复杂。本文介绍的方法不涉及安全性和互操作性,但这些可以在后期实现。目标是找到一个快速且简单的方法来在服务器上创建对象,将其序列化,然后发送回客户端。
在ASP.NET页面上,通过查询字符串来确定客户端请求的对象类型,创建对象,将其序列化为二进制数据,并作为二进制附件发送给客户端。客户端使用WebClient类下载该文件,然后反序列化回对象。服务器和客户端共享一个包含公共对象的类库。最初使用XML序列化实现,但发现速度较慢。如果需要互操作性,XML序列化仍然是一个可行的选择。
在服务器端,检查客户端请求的对象,并将其序列化为二进制附件返回。以下是C#代码示例:
protected void Page_Load(object sender, EventArgs e)
{
// 检查客户端请求的对象
if (Request.QueryString["op"] == "getdata")
{
// 创建示例数据对象的新实例
var data = new SampleData();
data.moreData = 34343;
data.otherData = true;
data.SomeData = "fewoifjweofjwepo";
// 设置内容类型和头部
Response.ContentType = "application/octet-stream";
Response.AppendHeader("Content-Disposition", "attachment; filename=sampleData.bin");
// 序列化对象并写入响应流
var binaryFormatter = new BinaryFormatter();
binaryFormatter.Serialize(Response.OutputStream, data);
// 重要的是要结束响应,否则其他页面内容也会发送给客户端
Response.End();
}
}
在客户端,使用查询字符串创建对服务器的请求,并反序列化响应。以下是C#代码示例:
// 创建服务的URL,这可以存储在配置文件中
string url = "http://localhost/BinaryServiceSample/Default.aspx?op=getdata";
// 将数据下载到字节数组
var client = new WebClient();
byte[] result = client.DownloadData(url);
// 创建内存流以存储对象
var mem = new MemoryStream(result);
var binaryFormatter = new BinaryFormatter();
var data = (SampleData)binaryFormatter.Deserialize(mem);
mem.Close();
// 将对象写入控制台
Console.Write(data.ToString());
Console.ReadLine();
虽然二进制序列化可能更符合直觉,但它可能在不同平台上不兼容。使用二进制序列化序列化对象比XML序列化快得多。此代码未包含任何错误处理,这是为了保持代码的清晰和简单。可以通过在发送给客户端之前加密字节来增加安全性,但这会使互操作性变得非常困难。
通过压缩字节可以在传输前获得额外的传输速度;ICSharpCode.SharpZipLib.dll可以在内存中压缩字节,它是免费的,但也可以利用.NET Framework实现HTTP压缩并将其嵌入到代码中。有关示例,请查看这篇文章:。