通过SOAP发送二进制流

时间:2009-07-07 11:28:08

标签: c# .net delphi winapi soap

我有一个“简单”的任务。我有一个现有项目,其中包含一个用C#编写的Web服务,该服务有一个方法可以向客户端发送一个巨大的XML文件。 (这是存储在服务器上的数据的备份文件,需要在其他地方发送。)此服务还设置了一些额外的身份验证/授权。 我有一个用于WIN32的现有Delphi 2007应用程序,它调用Web服务来提取XML数据以供进一步处理。它是一个没有.NET安装的遗留系统。 唯一的问题:XML文件很大(至少5 MB),需要作为一个整体发送。由于系统要求,我不能将其分成多个部分。而且我不允许对C#或Delphi代码进行重大更改。 (我只能在客户端和服务器上更改方法调用。)而且我不允许花费超过8个(工作)小时来提出更好的解决方案,否则事情就会保持不变。

我想要添加的修改是压缩XML数据(将其减少到大约100 KB),然后将其作为二进制流发送到客户端。然后,Delphi代码应接受此传入流并再次压缩XML数据。现在,只需对现有代码进行最少的更改,该怎么做呢?

(是的,我过去编写了原始客户端和服务器,它从来没有打算一次发送那么多数据。不幸的是,从我这里接过它的开发人员有其他想法,做了几个愚蠢的改变,做了更多损坏并离开公司之前,我的钢尖靴可以连接到他的后面,所以现在我需要解决一些问题。修复此Web服务的优先级与需要恢复的其他损坏相比非常低。)


服务器代码基于传统的ASMX内容,客户端代码是Delphi SOAP导入的结果,带有一些额外的修改。 XML是3000多个用户的每日更新,在当前的设计中恰好是巨大的。我们正在努力,但这需要时间。有一些更重要的项目需要先修复,但正如我所说,有一小部分时间可以快速解决这个问题。

4 个答案:

答案 0 :(得分:4)

这听起来像HttpHandler的好候选人

我的好工作链接在我的工作计算机上(我上班后会添加它们),但你可以看看它是否适合。

- 编辑 -
这是链接...

http://www.ddj.com/windows/184416694
http://visualstudiomagazine.com/articles/2006/08/01/create-dedicated-service-handlers.aspx?sc_lang=en&sc_mode=edit

答案 1 :(得分:1)

soap消息中的5MB文件有什么问题?我编写了一个运行在soap上的文档服务器,这个服务器没有大文件的问题。

如果大小对您来说是个问题我只会压缩​​和解压缩xml数据。这可以通过许多(免费)可用组件中的一个来轻松完成,以压缩TStream后代。

答案 2 :(得分:0)

如果你得到那种压缩,只需将每个字节转换为十六进制等效值,这只会增加一倍,然后发送。然后在另一端做相反的事情。或者我错过了什么?

答案 3 :(得分:0)

我同意布拉德布鲁斯,HttpHandler会很快,并且使用GZIP或Deflate Compression我可能错了......浏览器支持原生。你可以轻松地对基于文本的数据进行很好的压缩,以获得便宜的cpu时间。

System.IO.Compression.GZipStream GZipStream = new System.IO.Compression.GZipStream("Your XML Doc Stream",System.IO.Compression.CompressionMode.Compress)