Я пытаюсь получить изображение для кодирования в документе WordML. В исходной версии этой функции использовались файлы, но мне нужно было ее изменить, чтобы получить изображения, созданные «на лету» с помощью страницы aspx. Я адаптировал код для использования HttpWebRequest вместо WebClient. Проблема заключается в том, что я не думаю, что запрос страницы становится разрешенным, поэтому поток изображения недействителен, генерируя ошибку «параметр недопустим» при вызове Image.FromStream.Использование HttpWebRequest с динамическим URI вызывает «параметр недопустим» в 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 работает нормально. Если я заменю «staticURL» на «fullURL» в методе WebRequest.Create, я получаю ошибку. Любые идеи относительно того, почему запрос страницы не полностью разрешен?
И да, полный URL-адрес устраняет штраф и показывает изображение, если я разместил его в адресной строке.
Итак, ваш 'staticURL' относится к файлу в формате GIF. Что означает «fullURL»? Может быть, неправильный формат изображения? – dtb
Какая ошибка вы возвращаетесь? Вы уверены, что HttpWebRequest использует тот же самый Url, который вы вставили в браузер? Попробуйте получить tracelog с вашим приложением HttpWebRequest (http://ferozedaud.blogspot.com/2009/08/tracing-with-systemnet.html) и посмотреть, что он говорит. – feroze
Используя StreamReader, я смог определить, что то, что было включено в ответ, было страницей входа по умолчанию для пользователя. Кажется, что-то вроде разрешения, но я бы подумал, что WebRequests будет использовать разрешения, предоставленные пользователем, который уже зарегистрирован? Кто-нибудь знает об этом? –