将HttpWebRequest与动态URI一起使用会导致Image.FromStream中的“参数无效”

时间:2009-11-21 03:05:15

标签: c# url dynamic httpwebrequest

我正在尝试获取要编码为WordML文档的图像。此函数的原始版本使用文件,但我需要更改它以获取使用aspx页面动态创建的图像。我已经调整了代码以使用HttpWebRequest而不是WebClient。问题是我不认为页面请求得到解决,因此图像流无效,当我调用Image.FromStream时生成错误“参数无效”。

    public string RenderCitationTableImage(string citation_table_id)
{
    string image_content = "";
    string _strBaseURL = String.Format("http://{0}",
        HttpContext.Current.Request.Url.GetComponents(UriComponents.HostAndPort, UriFormat.Unescaped));
    string _strPageURL = String.Format("{0}{1}", _strBaseURL,
        ResolveUrl("~/Publication/render_citation_chart.aspx"));

    string _staticURL = String.Format("{0}{1}", _strBaseURL,
        ResolveUrl("~/Images/table.gif"));

    string _fullURL = String.Format("{0}?publication_id={1}&citation_table_layout_id={2}",
                                        _strPageURL, publication_id, citation_table_id);


    try
    {
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(_fullURL);
        HttpWebResponse response = (HttpWebResponse)request.GetResponse();
        Stream image_stream = response.GetResponseStream();
        // Read the image data
        MemoryStream ms = new MemoryStream();
        int num_read;
        byte[] crlf = System.Text.Encoding.Default.GetBytes("\r\n");
        byte[] buffer = new byte[1024];
        for (num_read = image_stream.Read(buffer, 0, 1024); num_read > 0; num_read = image_stream.Read(buffer, 0, 1024))
        {
            ms.Write(buffer, 0, num_read);
        }

        // Base 64 Encode the image data
        byte[] image_bytes = ms.ToArray();
        string encodedImage = Convert.ToBase64String(image_bytes);
        ms.Position = 0;
        System.Drawing.Image image_original = System.Drawing.Image.FromStream(ms); // <---error here: parameter is not valid
        image_stream.Close();

        image_content = string.Format("<w:p>{4}<w:r><w:pict><w:binData w:name=\"wordml://{0}\">{1}</w:binData>" +
            "<v:shape style=\"width:{2}px;height:{3}px\">" +
            "<v:imagedata src=\"wordml://{0}\"/>" +
            "</v:shape>" +
            "</w:pict></w:r></w:p>", _word_image_id, encodedImage, 800, 400, alignment.center);

        image_content = "<w:br w:type=\"text-wrapping\"/>" + image_content + "<w:br w:type=\"text-wrapping\"/>";
    }
    catch (Exception ex) 
    {
        return ex.ToString();
    }
    return image_content;

使用静态URI可以正常工作。如果我在WebRequest.Create方法中将“staticURL”替换为“fullURL”,则会出现错误。关于为什么页面请求没有完全解决的任何想法?

是的,完整的URL可以很好地解析,如果我将其发布到地址栏中,则会显示图像。

1 个答案:

答案 0 :(得分:1)

更新:

请阅读更新后的问题。由于您遇到了登录问题,请在执行请求之前尝试执行此操作:

request.Credentials = CredentialCache.DefaultCredentials

如果这不起作用,那么问题可能是在静态文件上没有强制执行身份验证,而是在动态文件上强制执行。在这种情况下,您需要首先登录(使用您的客户端代码)并保留登录cookie(在登录请求和第二个请求上使用HttpWebRequest.CookieContainer)或关闭您在页面上的身份验证'试图访问。

<强> ORIGINAL:

由于它适用于一个HTTP URL并且不能与另一个HTTP URL一起使用,因此开始诊断它的地方就是在HTTP级别找出两个请求之间的不同之处,这会解释代码中行为的差异。

为了弄清楚差异,我会使用Fiddler(http://fiddlertool.com)来比较这两个请求。比较HTTP标头。它们是一样的吗?特别是,它们是相同的HTTP内容类型吗?如果没有,那可能是你问题的根源。

如果标题相同,请确保静态和动态映像在服务器上的内容和文件类型完全相同。 (例如,使用文件...另存为将浏览器中的图像保存到磁盘)。然后使用Fiddler的Hex View来比较图像内容。你能看到任何明显的差异吗?

最后,我确定你已经检查了这一点,但只是确保:/Publication/render_citation_chart.aspx指的是实际的图像文件,而不是IMG元素周围的HTML包装,对吧?这将考虑您所看到的行为,浏览器将图像呈现为OK但您的代码却没有。