通过WCF将图像下载为字节数组失败

时间:2012-04-03 13:06:44

标签: c# wcf serialization

我遇到了烦人的问题。

有一个数据库包含图像作为字节数组。我使用以下方法从字节数组中取回图像:

// byte[] ImageData contains the image loaded from the DB.

var stream = new MemoryStream(ImageData);
Image img = Image.FromStream(stream);
img.Save("D://Test/test.png", ImageFormat.Png);

当客户端从服务器请求图像时,我在服务器端和客户端(使用不同的文件名)运行上述代码。

问题是:当我在服务器端时,这非常有用。文件保存,我可以在Windows Photo Viewer中打开并查看图像。

但是当我到达客户端时,似乎对这个字节数组进行了一些更改,而Image会抛出一个抱怨无效参数的异常。

此外,我尝试使用.png扩展名保存字节数组,然后使用Photo Viewer打开它。它也失败了。

在WCF旅行时,我的数据可能会发生什么,导致错误的字节数组?

编辑:比较服务器端和客户端文件的结果。

两边的数组看起来都是一样的,除了在客户端,他们错过了最后几个字节。 即使客户端的阵列实际上有LESS数据,文件大小也表示客户端图像比服务器端的BIGGER(正好是55字节)。

服务器没什么特别的。客户端在BackgroundThread中调用DownloadImg,但直接在服务引用上调用,如下所示:

var result = _service.DownloadImg(id);

服务界面:

[ServiceContract(Namespace="http://cannottellyou.com")]
public interface IImageService
{
    [OperationContract]
    DBImage DownloadImg(int id);
}

Image对象:

[DataContract(Namespace="http://cannottellyou.com")]
public class DBImage
{
    [DataMember]
    public virtual byte[] Data { get; set; }
}

在服务器上加载图像的功能:

public class ImgService: IImageService
{
    public DBImage DownloadImg(int id)
    {
        var img = new DBImage();

        //That is where we get the byte array, and where I tested the image with the above code, and it works. I am sorry I cannot tell you more about this part...
        // img.Data holds the byte[] by now

        return img;
    }
}

绑定:

<binding name="BinBinding" messageEncoding="Mtom"
    closeTimeout="00:10:00"
    openTimeout="00:01:00"
    sendTimeout="00:05:00"
    receiveTimeout="00:10:00"
    maxReceivedMessageSize="67108864"
    maxBufferPoolSize="65536">
    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="2097152"
        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
    <security mode="None">
        <message  />
    </security>
</binding>

3 个答案:

答案 0 :(得分:1)

这似乎是由Mtom编码引起的。我们切换到Base64,一切都很好。

但仍然不知道为什么......

答案 1 :(得分:0)

我不知道,但你可以试试这个:

  • 您正在返回DBImage,您是否尝试过返回byte [] Data?
  • 你确定你的图像不比你的装订设置大吗?

答案 2 :(得分:0)

通常,如果数组大于各种绑定参数中设置的限制,我会期望异常不是截断数组,并且奇怪的是,无论组织图像/数组大小如何,都会丢失字节。我想你必须在某个地方做些奇怪的事情。但只是为了确保Id尝试读取配额增加:

   <readerQuotas maxDepth="32"
        maxStringContentLength="10000000" maxArrayLength="10000000"
        maxBytesPerRead="10000000" maxNameTableCharCount="10000000" />

并缓冲相同的内容:

 maxBufferPoolSize="10000000" maxBufferSize="10000000" maxReceivedMessageSize="10000000">

但是根据你的描述,我不确定这会有所帮助。