我遇到了烦人的问题。
有一个数据库包含图像作为字节数组。我使用以下方法从字节数组中取回图像:
// 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>
答案 0 :(得分:1)
这似乎是由Mtom编码引起的。我们切换到Base64,一切都很好。
但仍然不知道为什么......
答案 1 :(得分:0)
我不知道,但你可以试试这个:
答案 2 :(得分:0)
通常,如果数组大于各种绑定参数中设置的限制,我会期望异常不是截断数组,并且奇怪的是,无论组织图像/数组大小如何,都会丢失字节。我想你必须在某个地方做些奇怪的事情。但只是为了确保Id尝试读取配额增加:
<readerQuotas maxDepth="32"
maxStringContentLength="10000000" maxArrayLength="10000000"
maxBytesPerRead="10000000" maxNameTableCharCount="10000000" />
并缓冲相同的内容:
maxBufferPoolSize="10000000" maxBufferSize="10000000" maxReceivedMessageSize="10000000">
但是根据你的描述,我不确定这会有所帮助。