【问题标题】:Sending a binary stream through SOAP通过 SOAP 发送二进制流
【发布时间】:2009-07-07 11:28:08
【问题描述】:

我有一个“简单”的任务。我有一个现有项目,其中包含一个用 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 多个用户的每日更新,这在当前设计中恰好是巨大的。我们正在努力,但这需要时间。有更重要的项目需要先解决,但正如我所说,有少量时间可以快速解决此问题。

【问题讨论】:

  • 你还没有说你是使用 WCF 还是传统的 ASMX 技术。
  • 在备份服务器的其余文件时,为什么不直接备份那个 XML 文件呢?为什么要特别对待?您正在备份服务器,不是吗?

标签: c# .net delphi winapi soap


【解决方案1】:

这听起来很适合 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

【讨论】:

  • 听起来不错,只要快速实施即可。 :-) 否则,我将没有时间进行修改。 (有太多更重要的问题需要先解决。)
  • 现在我只需要客户端处理这个流。 (并希望它很容易在 Delphi/WIN32 中实现。)
  • 我找到了! :-) 只需使用 URL 下载页面。至少,比现在的服务好……
【解决方案2】:

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

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

【讨论】:

  • 问题是客户端应用程序可能安装在一个简单的上网本上,该上网本带有 7MBits 的 GPRS 无线网络。由于防火墙、病毒扫描程序的额外开销和可能的不良连接,我们的“现场代理”将不得不等待很长时间才能收到他们的每日更新......
【解决方案3】:

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

【讨论】:

  • 是的,这也可以,但不能保证当前的压缩级别。此外,考虑到最终用户的有限带宽,需要发送的数据越少越好。很高兴没有用户会使用旧的拨号连接。
【解决方案4】:

我同意 Brad Bruce 的观点,HttpHandler 会很快,而使用 GZIP 或 Deflate 压缩可能是错误的……浏览器本身支持。您可以以低廉的 CPU 时间轻松压缩基于文本的数据。

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

【讨论】:

    猜你喜欢
    • 2014-03-31
    • 2012-01-02
    • 1970-01-01
    • 2019-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-14
    相关资源
    最近更新 更多