我有一个桌面应用程序,它从 Web 服务器下载一些 dll,然后用Assembly.Load
. 在一台 XP 机器上,我第二次运行应用程序时抛出了 BadImageFormatExceptions。在其他 Win 7 和 XP 机器上,它运行良好。
似乎只返回了 dll 的前 65536 个字节,并且这只发生在下载的 dll 被缓存时。
什么可能导致截断?
这是我重现问题的方式。首先,下载文件,将其添加到缓存中:
client = new WebClient();
client.CachePolicy = new RequestCachePolicy(RequestCacheLevel.Reload);
data = client.DownloadData(url);
Console.WriteLine("Got " + data.Length);
这有效,在这种情况下打印“Got 159744”。
通常我会使用RequestCacheLevel.Deafult
,但为了可靠地重现问题,我只从缓存中读取第二个请求:
client = new WebClient();
client.CachePolicy = new RequestCachePolicy(RequestCacheLevel.CacheOnly);
data = client.DownloadData(url);
Console.WriteLine("Got " + data.Length);
在大多数机器上,这会输出“Got 159744”,但是在破旧的 XP 机器上,它会输出“Got 65536”。查看 的源代码WebClient
,它使用 65536 字节的缓冲区大小。怀疑有问题WebClient
,我直接使用WebRequest
:
request = WebRequest.Create(url);
request.CachePolicy = new RequestCachePolicy(RequestCacheLevel.CacheOnly);
responseStream = request.GetResponse().GetResponseStream();
var buffer = new byte[16384];
using (var memoryStream = new MemoryStream())
{
int read;
while ((read = responseStream.Read(buffer, 0, buffer.Length)) > 0)
{
Console.WriteLine("Read... " + read + " bytes");
memoryStream.Write(buffer, 0, read);
}
data = memoryStream.ToArray();
}
Console.WriteLine("Got " + data.Length);
在这种情况下,只输出一个“Read...”行,并且只读取了 16384 个字节。没有抛出流异常结束,并且我得到的字节看起来不错。
响应流结束过早似乎是一个问题,但可能是什么原因造成的?