【问题标题】:Downloading images via WCF vs WebClient通过 WCF 与 WebClient 下载图像
【发布时间】:2009-04-30 04:29:02
【问题描述】:

我正在从 WCF 服务向 Silverlight 客户端获取数据(图像,200-400kb),并注意到每次此类消息到达时 Silverlight 都会停止几分之一秒。这不是很严重,但动画会停止一段时间,整个用户体验都被破坏了。

提问时间:

1) 您认为改用 WebClient 是否有益?

2) Silverlight 中的“正常”WCF 客户端(“正常”是指事件驱动方案)是否在主(调用)线程或后台反序列化数据协定?

3) 您是否认为从 XML 中的数据合约反序列化二进制对象所需的开销(由于 Base64 XML 编码带来更大的数据大小)比到服务器的额外往返行程更大/更小(在这种情况下,数据合约将只包含图像的 URL,然后我可以使用 WebClient 来获取它——因此又是一次旅行)?

4) 是否可以在后台线程(不是 UI 线程)中从 byte[] 数组创建图像?

非常感谢任何帮助、想法和建议。

谢谢,

卡罗尔

PS:我不能使用 DeepZoom,因为业务需求与 DeepZoom 场景并不匹配。

【问题讨论】:

    标签: xml wcf silverlight web-services


    【解决方案1】:

    您也可以只在返回图像的服务器端使用 HTTP 处理程序类。我假设您选择使用 WCF 服务,因为服务器端有一些逻辑可以确定应该返回哪个图像。使用 HTTP 处理程序,您可以选择在服务器端执行该逻辑并在一次往返中返回图像。

    让处理程序调用您的 WCF 服务以获取 URL、检索图像并将其返回到 HTTP 响应流中。如果您正确设置 MIME 类型,客户端(在本例中为 Silverlight)将不会知道其中的区别。

    【讨论】:

    • 感谢史蒂夫,最后我使用 REST 协议创建了第二个端点,因此我可以从同一个服务以二进制形式返回图像,并通过 WebClient 在 Silverlight 中使用它。
    • 更新:我做了一些性能测试。如果有人感兴趣:通过 REST 的原始二进制文件比作为 DataContract 序列化的相同数据快 2.5。
    【解决方案2】:

    WCF 的主要目的是提供一种从一个地方到另一个地方获取结构化数据的方法。我不认为图像是它的意思。我认为使用 WebClient 可能会更好更快地工作。此外,您可能还想进一步了解是否有其他解决方案专门用于使用 Silverlight 从服务器下载资源文件。


    更新: 实际上,如果您只是使用常规的 Image 控件,您可以将 Source 属性设置(或更改)为新的 Bitmap - 这将自动触发从服务器位置下载图像:

    img.Source = new BitmapImage(new Uri("http://the.image.url/image.jpg"));
    

    然后,您可以以编程方式将 Image 控件添加到您的 Silverlight 文档中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-05
      相关资源
      最近更新 更多