由于某种奇怪的原因,通过IE6使用的一个有五年历史的内部asp.net 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();
页面中显示的不是图像,而是红十字。这种情况只发生在页面上显示的动态生成的图像上,而不是静态链接的图像上。
如果我尝试在它自己的窗口中打开图像,我会看到图像或大量官样文章文本(我猜这意味着浏览器没有设置/选择MIME类型)
Response.End()
通常不好,因为它会中止IIS线程,即使它处于Flush()-ing的中间。
使用Response.Flush()
和Response.Close()
确保所有内容都发送到客户端。
我可能错了,但我认为Content-Length
应该包含以字节为单位的正文长度。Response.BinaryWrite
将对数据进行base64编码,该数据将比您在标头中告诉它的byte[]
长度更长。