2011-06-06 44 views
2

由于一些奇怪的原因,一个五年的内部asp.net网络应用程序通过IE6使用突然出现问题,即使没有代码的变化。某些用户不会看到正在流式传输到Web浏览器的某些图像。如何流式传输字节数组图像?

我不知道为什么这个突然开始发生或者原因是什么 - 不过作为搜索的一部分,我正在考虑用于流式传输图像的代码是否存在缺陷。

图像保存在内存中是一个字节数组,然后使用以下代码进行流式传输。这是流式传回图像的最佳方式吗?

Response.Clear(); 
Response.ClearHeaders(); 
Response.ClearContent();   

// Work out file type 
switch(Path.GetExtension(imageFilename).ToLower()) 
{ 
    case ".jpg": 
    case ".jpeg": 
     Response.ContentType = "image/jpeg"; 
     break; 
    case ".gif": 
     Response.ContentType = "image/gif"; 
     break; 
    default: 
     Response.ContentType = "binary/octet-stream"; 
     break; 
} 

Response.AddHeader("Content-Length", imageBytes.Length.ToString()); 
Response.Cache.SetCacheability(HttpCacheability.NoCache); 
Response.BinaryWrite(imageBytes); 
Response.End(); 

不是在页面中显示图像,而是显示红色十字。这只发生在页面上显示的动态生成的图像上,而不是静态链接的图像。

如果我尝试在自己的窗口中打开图像,我会看到图像或一大堆gobbledygook文本(我猜这意味着MIME类型没有被浏览器设置/拾取)

+0

乍一看似乎是合适的,但你能概述一下你的客户有哪些“问题”?这是全部图像还是仅仅是一些?随机?他们是下载这些图像还是嵌入父页? – Mantorok 2011-06-06 12:44:39

+0

当图像没有出现时,你会得到什么样的位置?空白,红-X等? – 2011-06-06 12:58:34

+0

@Mantorok @Damien_The_Unbeliever我已经用澄清更新了原始问题。 – 2011-06-06 13:56:13

回答

1

Response.End()通常是不好的,因为它会中止IIS线程,即使它处于Flush()中间。

使用Response.Flush()后跟Response.Close()以确保所有内容都发送到客户端。

+0

我已经更新了这些'Response.Flush(); Response.Close()'而不是'Response.End()' - 不幸的是它给出了相同的结果 – 2011-06-07 13:53:45

+0

@Peter检查IIS设置没有改变 - 特别是我记得使用HTTP压缩时的问题,因为这会破坏我们的一些流的东西。 – Leon 2011-06-07 15:08:28

0

我可能是错误的这一个,但我认为Content-Length应包含字节的身体的长度。 Response.BinaryWrite将base64编码的数据,这将是更长,然后你告诉它的长度为byte[]在头。

+0

嗯,由于只有一些客户有这个问题似乎不太可能,但你的答案肯定会提出一个很好的问题!我现在好奇自己。 – Mantorok 2011-06-06 12:53:51

+0

'.BinaryWrite'是'.OutputStream.Write'的包装,可以正确地用于传输二进制数据。它不执行任何编码。作为@Damien_The_Unbeliever正确地指出该响应不会被编码,所以 – 2011-06-06 12:57:21

+0

。所以我的整个答案是不正确的。 – 2011-06-06 18:17:27