开发者

How can I stream a .net chart as a PNG? (Parameter is not valid)

开发者 https://www.devze.com 2023-01-15 14:46 出处:网络
I have a generic handler in vb.net that builds a chart and then returns a png as a result. Relevant code on /GetChart.ashx (which is actually called as /GetChart.ashx?report=1):

I have a generic handler in vb.net that builds a chart and then returns a png as a result.

Relevant code on /GetChart.ashx (which is actually called as /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)
开发者_StackOverflow中文版context.Response.Flush()
context.Response.Close()

When I try and hit this page via FireFox or IE I DO receive the PNG image in the browser without any errors.

BUT, when I try and call this handler from another generic handler, I receive the parameter is invalid when calling FromStream for the image:

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)

If I comment out this line and use the Google image to test instead ...

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

... it WORKS, so that leads me to believe that the problem lies in the FIRST handler (GetChart.ashx) and somehow it's not delivering exactly what I'm looking for even though the browsers handle it as expected?

Any thoughts or assistance would be greatly appreciated.

Thank you!


First thought: try dumping the contents of the stream to disk, as the easiest way of seeing what's actually being delivered. Compare it to the original file.

Second thought: use WireShark to see what's happening at the HTTP level.


Can you simplify your code to:

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

and see what that gets you?


I added a section to the web.config to allow all users to hit GetChart.ashx and now the request goes through and the image is retrieved.

<location path="GetChart.ashx">
    <system.web>
      <authorization>
        <allow users="?"/>
      </authorization>
    </system.web>
  </location>
0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号