C# WCF-返回大图像-您的体验和提示

C# WCF-返回大图像-您的体验和提示,c#,.net,wcf,C#,.net,Wcf,我们使用WCF服务层从存储库返回图像。一些图片是彩色的,多页的,几乎所有的都是TIFF格式的。我们经历了缓慢——许多问题之一 1.)您在通过WCF返回图像方面有哪些经验 2.)对于返回大图像,您有什么建议和提示吗? 3.)所有消息都通过SOAP序列化是否正确? 4.)wcf是否在压缩大型tiff文件方面做得很差 谢谢大家 在我之前的一个项目中,我们遇到了类似的问题。我们在C#中有一个Web服务,它接收对媒体的请求。介质的范围可以从文件到图像,并使用BLOB列存储在数据库中。最初,处理媒体检索请求

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

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


谢谢大家

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

计算机没有问题 一门无法用计算机解决的科学 额外的间接层次

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

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

Method2会连续调用,直到有更多的内容可供媒体检索。调用包括有关当前偏移量的信息以及调用Method1时提供的勾选Id。返回更新当前位置

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

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


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



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

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

另一个选择是(等待它…)在这里不使用WCF-可能只是一个返回二进制文件的处理程序(ashx等)


再压缩-WCF本身在压缩方面不会有太多的参与;传输可能,特别是通过启用gzip的IIS等进行传输-但是,图像因难以压缩而臭名昭著。

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

流式传输将允许您传递TIFF图像,就像它是本地文件系统上的正常文件流一样。有关选择及其优缺点的更多详细信息,请参阅


不幸的是,您仍然需要传输大量数据,考虑到已经提出的问题,我看不到任何解决方法。

我只想补充一点,确保数据流化而不是缓冲非常重要

我在某个地方读到,即使您将transferMode设置为“Streamed”,如果您不使用流本身、消息或IXmlSerializable的实现,消息也不会流化


请务必记住这一点。

好的,请支持ZombieSheep和Seba Gomez的回答,您一定要查看数据流。通过这样做,您可以无缝地将GZipStream集成到流程中。在客户端,您可以反转压缩过程并将流转换回所需的图像

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

下面是关于启用流媒体的说明。是描述流媒体合约限制的MSDN页面

我假设您也在控制客户端代码,如果不这样做,这可能会非常困难。我只有在控制服务器和客户端时才使用流媒体


祝你好运。

谢谢你的评论。我们使用API从第三方存储库检索文档。我们的问题是,当WCF是一个大的TIFF文件时,它似乎在压缩数据方面做得很差。尽管如此,如果我们能够找到一种多线程方式将图像块取回,您的建议可能仍然很有价值,但是我们可能会局限于第三方API。受限于第三方API,您可能只能选择使用二进制传输通道,并且可能会使用GZipStream进行自定义压缩。我假设第三方库只能一次性提供图像,而不能分块提供。好问题:我们正在使用netTCP。我们受API的支配,对它的所有调用都必须通过WCF服务层来执行。我会调查的。我们可能需要将图像检索部分移动到流式sep服务。