对于给定的 URL(例如http://covers.oreilly.com/images/0636920022886/bkt.gif ) ,或多或少类似于下面的例程在几个不同的环境中工作,但在 Azure 上失败,但出现以下异常:
System.ArgumentException:参数无效。在 System.Drawing.Image.FromStream(流流,布尔 useEmbeddedColorManagement,布尔 validateImageData) 在 System.Drawing.Image.FromStream(流流)
在所有情况下,有问题的程序集都是 System.Drawing,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a,所以我假设收到的数据在 Azure 上有所不同。
public static DimensionResult Is404(string url)
{
DimensionResult result = null;
HttpWebRequest request = Http.PrepareGetRequest(new Uri(url), false, false, "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)");
request.Timeout = 2500;
request.Method = "GET";
request.AddRange(0, 2048);
request.KeepAlive = false;
request.AllowAutoRedirect = true;
try
{
result = new DimensionResult();
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
result.ContentEncoding = response.ContentEncoding;
result.Url = response.ResponseUri.ToString();
result.Is404 = (response.StatusCode != HttpStatusCode.PartialContent && response.StatusCode != HttpStatusCode.OK) || System.Text.RegularExpressions.Regex.IsMatch(response.ContentType, "text|html", System.Text.RegularExpressions.RegexOptions.IgnoreCase);
if (!result.Is404)
using (System.Drawing.Image image = System.Drawing.Image.FromStream(response.GetResponseStream()))
{
result.Width = image.Width;
result.Height = image.Height;
}
}
}
catch (Exception ex)
{
result.Exception = ex;
result.Is404 = true;
}
return result;
}
请不要关注请求的字节数(这是一个简化版本),而是关注 .NET 网络堆栈中的哪些设置可以解释服务器之间的不同响应?
在这两种情况下,到目前为止,我已经记录了响应标头并且它们是相同的,还没有网络跟踪:
日期:格林威治标准时间 2012 年 4 月 20 日星期五 11:47:05,服务器:Apache,接受范围:字节,最后修改时间:格林威治标准时间 2012 年 2 月 24 日星期五 17:21:00,内容范围:字节 0-2048/3556 ,Content-Length:2049,Content-Type:image/gif,Cache-Control:max-age=2592000,Expires:Sun, 20 May 2012 11:47:05 GMT,Connection:close
更新:我已经记录了在两种环境中收到的字节,它们恰好是相同的!所以相同的响应头,相同的响应长度,相同的响应内容,相同的程序集,不同的行为。