2009-11-21 1 views
1

Я пытаюсь получить изображение для кодирования в документе 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-адрес устраняет штраф и показывает изображение, если я разместил его в адресной строке.

+0

Итак, ваш 'staticURL' относится к файлу в формате GIF. Что означает «fullURL»? Может быть, неправильный формат изображения? – dtb

+0

Какая ошибка вы возвращаетесь? Вы уверены, что HttpWebRequest использует тот же самый Url, который вы вставили в браузер? Попробуйте получить tracelog с вашим приложением HttpWebRequest (http://ferozedaud.blogspot.com/2009/08/tracing-with-systemnet.html) и посмотреть, что он говорит. – feroze

+0

Используя StreamReader, я смог определить, что то, что было включено в ответ, было страницей входа по умолчанию для пользователя. Кажется, что-то вроде разрешения, но я бы подумал, что WebRequests будет использовать разрешения, предоставленные пользователем, который уже зарегистрирован? Кто-нибудь знает об этом? –

ответ

1

UPDATE:

Просто прочитайте обновленное вопрос. Поскольку вы работаете с проблемами входа, попробуйте сделать это, прежде чем выполнить запрос:

request.Credentials = CredentialCache.DefaultCredentials 

Если это не сработает, то, возможно, проблема в том, что не применяются на статические файлы аутентификации, но в настоящее время принудительно применяется к динамическим файлам. В этом случае вам необходимо сначала войти в систему (используя код клиента) и сохранить файл cookie для входа (используя HttpWebRequest.CookieContainer по запросу на вход, а также по второму запросу) или отключить проверку подлинности на странице, которую вы пытаетесь доступ.

ORIGINAL:

Поскольку он работает с одним HTTP URL и не работает с другой, место, чтобы начать диагностику этого является выяснение того, что отличается между двумя запросами на уровне HTTP, на долю которого приходится за разницу в поведении в вашем коде.

Чтобы понять разницу, я бы использовал Fiddler (http://fiddlertool.com) для сравнения двух запросов. Сравните заголовки HTTP. Они одинаковы? В частности, являются ли они одним и тем же типом содержимого HTTP? Если нет, это, вероятно, источник вашей проблемы.

Если заголовки одинаковы, убедитесь, что статическое и динамическое изображение - это точно такой же контент и тип файла на сервере. (например, используйте File ... Save As, чтобы сохранить изображение в браузере на ваш диск). Затем используйте Hex View Fiddler для сравнения содержимого изображения. Вы видите какие-то очевидные различия?

Наконец, я уверен, что вы уже проверили это, но просто убедитесь, что: /Publication/render_citation_chart.aspx ссылается на фактический файл изображения, а не на оболочку HTML вокруг элемента IMG, правильно? Это будет учитывать поведение, которое вы видите, когда браузер отображает изображение в порядке, но ваш код этого не делает.

+0

См. Мой комментарий выше.Я возвращаю страницу входа вместо изображения. –

+0

yep, имеет смысл. см. мой обновленный ответ - это устраняет проблему? –

+0

Да! Сотрудник указал мне на аналогичный фрагмент из другого проекта, который разрешил проблему. Ответ состоял в том, чтобы включить CookieContainer для текущего объекта Request. –