我有一个WCF服务,它提供一个端点来动态生成QR映像.该图像首先写入内存流tempStream
。然后,在端点中有以下代码:
HttpResponse response = HttpContext.Current.Response;
response.Clear();
response.ClearContent();
response.ClearHeaders();
response.Buffer = false;
response.ContentType = "image/png";
response.CacheControl = "No-Cache";
response.AddHeader("Content-Length", tempStream.Length.ToString())
response.AddHeader("Accept-Ranges", "bytes");
tempStream.WriteTo(response.OutputStream);
response.Flush();
response.End();
它在Firefox中运行得很好。如果手动命中端点,则会下载图像,如果我将端点引用为src
标记中的img
属性,则图像将内联加载。但是,在IE中,图像不会在img
标记中加载内联,如果我尝试手动命中端点,它将在第一次加载完整的映像,但随后的刷新(似乎在浏览器重新启动之前),它只加载图像的一部分。
在检查F12窗口中的网络选项卡时,它似乎正在从服务器下载确切的1.00KB数据(包括标头),这意味着它获得了大约750 KB的图像数据。然后,它向服务器发出另一个相同的请求,并且只获取没有图像数据的头。Content-Length
头被正确地设置为图像的大小;IE只是没有下载那么多。再说一遍,Firefox很好。
我的同事建议我将transferMode
设置为Streamed
in Web.config
,但这也不起作用。如何让IE一次下载整个图像?
编辑:
我应该注意,在Visual的IIS Express服务器中运行WCF服务时,工作正常。只有当应用程序部署到IIS 7.5时,才会出现问题。Firefox在这两种环境中都运行良好。
编辑2:
我刚刚在响应中添加了Thread.Sleep(1000)
,就在response.End()
之前,它解决了这个问题。IE现在下载整个响应,不尝试发出第二个请求。为什么?!response.Flush();
应该阻止请求并在调用response.End()
之前将所有的数据发送给客户机,据我所知,response.End()
也会刷新流,因此手动调用Flush()
是多余的。为什么显式地阻塞线程一秒钟使其工作?我还应该注意,如果不放入Thread.Sleep(1000)
,它仍然适用于first request,因为.NET必须在AppPool每次重新启动时编译后端,这会像Thread.Sleep(1000)
一样阻塞请求一定的时间。
发布于 2015-10-05 08:36:49
好吧,我现在解决了。现在我不再使用HttpContext.Current.Response,而是使用WebOperationContext.Current.OutgoingResponse。另外,我不是写入响应的输出流,而是从端点返回stream对象,特别是将图像保存到的MemoryStream (在图像被回溯到0之后)。在传输完成之前,似乎没有一致的方式将操作写到HttpResponse
块,因此请求总是结束得太快。甚至火狐在大图片上也有问题。从端点函数返回Stream
对象显然会使WCF等待,直到所有数据在结束请求之前被发送。
发布于 2015-10-03 18:42:47
试试这个:
response.AddHeader("Content-Disposition", "filename=" + fileName);
https://stackoverflow.com/questions/32916353
复制相似问题