Как я могу транслировать диаграмму .net в формате PNG? (Параметр недействителен) - PullRequest
2 голосов
/ 09 сентября 2010

У меня есть общий обработчик в vb.net, который строит диаграмму, а затем возвращает png в результате.

Соответствующий код в /GetChart.ashx (который на самом деле называется /GetChart.ashx?report=1):

AssetChart.RenderType = RenderType.BinaryStreaming

Dim mstream As New MemoryStream()
AssetChart.SaveImage(mstream, ChartImageFormat.Png)
Dim byteArray As Byte() = mstream.ToArray()

context.Response.Clear()
context.Response.ContentType = "image/png"
context.Response.AddHeader("Content-Length", byteArray.Length.ToString())

context.Response.BinaryWrite(byteArray)
context.Response.Flush()
context.Response.Close()

Когда я пытаюсь открыть эту страницу через FireFox или IE, я получаю изображение PNG в браузере без ошибок.

НО, когда я пытаюсь вызвать этот обработчик из другого универсального обработчика, я получаю недопустимый параметр при вызове FromStream для изображения:

url = "http://www.google.com/images/logos/ps_logo2.png"    
url = "http://mysite/GetChart.ashx?report=1"


Dim HttpWebRequest As HttpWebRequest = DirectCast(WebRequest.Create(url), HttpWebRequest)
Dim HttpWebResponse As HttpWebResponse = DirectCast(HttpWebRequest.GetResponse(), HttpWebResponse)

Dim respStream As Stream = HttpWebResponse.GetResponseStream()

Dim image As System.Drawing.Image = System.Drawing.Image.FromStream(respStream)
image.Save("C:\test.png", ImageFormat.Png)

Если я закомментирую эту строку и вместо этого использую изображение Google ...

url = "http://mysite/GetChart.ashx?report=1"

... это работает, поэтому я полагаю, что проблема заключается в обработчике FIRST (GetChart.ashx), и почему-то он не доставляет именно то, что мне нужно, даже если браузеры справляются с этим должным образом?

Буду признателен за любые мысли или помощь.

Спасибо!

Ответы [ 3 ]

1 голос
/ 09 сентября 2010

Можете ли вы упростить свой код до:

context.Response.Clear()
context.Response.ContentType = "image/png"
AssetChart.SaveImage(context.Response.OutputStream, ChartImageFormat.Png)

и посмотреть, что вам это даст?

1 голос
/ 09 сентября 2010

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

Вторая мысль: используйте WireShark , чтобы увидеть, что происходит на уровне HTTP.

0 голосов
/ 09 сентября 2010

Я добавил раздел в web.config, чтобы позволить всем пользователям нажимать GetChart.ashx, и теперь запрос проходит, и изображение извлекается.

<location path="GetChart.ashx">
    <system.web>
      <authorization>
        <allow users="?"/>
      </authorization>
    </system.web>
  </location>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...