0

对于给定的 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

更新:我已经记录了在两种环境中收到的字节,它们恰好是相同的!所以相同的响应头,相同的响应长度,相同的响应内容,相同的程序集,不同的行为。

4

1 回答 1

0

根据http://en.wikipedia.org/wiki/Graphics_Interchange_Format,一个 gif 文件以字符“GIF87a”或“GIF89a”开头,然后是它的宽度/高度。因此,如果您只需要宽度/高度信息,则可以读取字节 6-9。不需要 GDI+ (System.Drawing.dll)。根据我的经验,在服务器环境,特别是 Windows Azure 中使用 System.Drawing.dll 会导致不可预知的结果。如果您需要高级位图处理,您可以使用 WIC 或 WPF(在挂钩下使用 WIC)。

此致,

明旭。

于 2012-04-23T09:05:42.607 回答