我正在尝试获取要编码为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可以很好地解析,如果我将其发布到地址栏中,则会显示图像。
答案 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但您的代码却没有。