WCF-返回大图像-您的经验和技巧

本文关键字:经验 返回 图像 WCF- | 更新日期: 2023-09-27 17:48:53

我们使用WCF服务层从存储库返回图像。有些图像是彩色的,多页的,几乎所有的都是TIFF格式。我们经历了缓慢——这是许多问题之一。

1.)您在通过WCF返回图像方面有哪些经验2.)对于返回大图像,你有什么建议吗?3.)所有消息都是通过SOAP序列化的,对吗
4.)wcf在压缩大型tiff文件方面做得不好吗?

谢谢大家!

WCF-返回大图像-您的经验和技巧

好的,只需对ZombieSheep和Seba Gomez的回应进行分析,您绝对应该考虑流式传输数据。通过这样做,您可以将GZipStream无缝集成到流程中。在客户端,您可以反转压缩过程,并将流转换回您想要的图像。

通过使用流,可以选择一些类作为参数/返回类型,并且您需要在整个过程中修改绑定。

以下是MSDN关于启用流媒体的网站。这是MSDN页面,描述了对流媒体合约的限制。

我假设你也在控制客户端代码,如果你不控制,这可能真的很难。我只在控制服务器和客户端时才使用流媒体。

祝你好运。

如果您使用另一个.Net程序集作为客户端,则可以使用两种方法返回大块数据,即流式传输或MTOM。

流式处理将允许您传递TIFF图像,就好像它是本地文件系统上的普通文件流一样。有关选择及其利弊的更多详细信息,请参阅此处。

不幸的是,你仍然需要传输一大块数据,考虑到已经提出的问题,我看不出有什么办法可以绕过这一点。

我只想补充一点,确保数据是流式传输而不是缓冲的非常重要。

我在某个地方读到,即使您将transferMode设置为"Streamed",如果您不使用Stream本身、Message或IXmlSerializable的实现,消息也不会进行流式传输。

一定要记住这一点。

您使用的是什么绑定?WCF会有一些开销,但如果将基本http与MTOM一起使用,则会丢失大部分base-64 overad。你仍然会有标题等

另一种选择是(等待…)在这里不使用WCF——也许只是一个返回二进制文件的处理程序(ashx等)。

重新压缩-WCF本身在压缩方面不会有太大的作用;传输可能会发生,尤其是通过启用了gzip的IIS等传输——然而,图像因难以压缩而臭名昭著。

在我以前工作的一个项目中,我们遇到了类似的问题。我们在C#中有一个Web服务,它接收对媒体的请求。媒体可以从文件到图像,并且使用BLOB列存储在数据库中。最初,处理媒体检索请求的web方法从BLOB读取块并返回给调用者。这是一次往返服务器的旅行。这种方法的问题是客户端没有操作进度的反馈。

计算机没有问题无法通过额外的间接性。

我们首先用三种方法重构该方法。

方法1设置调用方和web服务之间的对话。这包括有关请求的信息(如媒体Id)和功能交换。web服务使用勾选的Id进行响应,该Id用于调用方将来的请求。此初始调用用于资源分配。

方法2被连续调用,直到有更多要为媒体检索的方法。调用包括有关当前偏移量的信息以及调用Method1时提供的勾选Id。退货会更新当前职位。

Method2报告已完成对请求媒体的读取时,调用Method3来完成请求。这释放了已分配的资源。

这种方法很实用,因为您可以立即向用户提供有关操作进度的反馈。您还有一个好处,就是将请求拆分到不同线程中的Method2。进度可以像一些BitTorrent客户端那样按块报告。


根据BLOB的大小,您可以选择一次性从数据库加载它,也可以选择按块读取它。这意味着您可以使用一种平衡机制,该机制基于给定的水印(BLOB大小)选择一次性或分块加载。


如果仍然存在性能问题,请考虑使用GZipStream打包结果或阅读有关消息编码器的信息,并特别注意二进制和消息传输优化机制(MTOM)。