【问题标题】:ASP.NET .ASHX image generation. NotSupportedExceptionASP.NET .ASHX 图像生成。不支持异常
【发布时间】:2013-07-12 08:45:41
【问题描述】:

我正在使用以下代码在我的 ASP.NET Web 应用程序中动态绘制图像。

Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest
    Dim js As New JavaScriptSerializer
    Dim ai As absencestruct = js.Deserialize(Of absencestruct)(CStr(context.Request.QueryString.Item("json")))

    'Ensure font is readable (half height of block or 12px whichever is smaller)
    Dim f As Font = New Font("Calibri", Math.Min(CInt(CDbl(ai.size.height) / 2.5), 12), GraphicsUnit.Pixel)

    Dim img As New Bitmap(CInt(ai.size.width), CInt(ai.size.height))
    Dim g As Graphics = Graphics.FromImage(img)

    g.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality

    If ai.textStyle <> textStyleEnum.invisible Then
        g.Clear(Color.White)
    End If

    Dim r As New Rectangle(1, 1, CInt(ai.size.width) - 1, CInt(ai.size.height) - 1)

    r = New Rectangle(r.Left + 2, r.Top + 2, r.Width - 4, r.Height - 4)

    drawAbsence(ai, True, r, g)
    If ai.abs2.type <> AbsenceItem.halfDays.Errored AndAlso ai.drawStyle = AbsenceItem.drawStyle.orphan Then
        drawAbsence(ai, False, r, g)
    End If

    Dim s As SizeF = g.MeasureString(ai.day.ToString, f)
    Dim br As SolidBrush = CType(Brushes.Black, SolidBrush)
    If ai.textStyle = textStyleEnum.otherMonth Then br = CType(Brushes.Gray, SolidBrush)

    If ai.textStyle <> textStyleEnum.invisible Then
        g.DrawString(ai.day.ToString, f, br, New Point(CInt((CDbl(ai.size.width) / 2) - CInt(s.Width / 2)), CInt((CDbl(ai.size.height) / 2) - CInt(s.Height / 2))))
    End If

    context.Response.ContentType = "image/png"
    img.Save(context.Response.OutputStream, ImageFormat.Png)
    img.Dispose()
End Sub

以前这工作得很好,但是突然之间,现在一旦到达

img.dispose

我得到一个异常 NotSupportedException "Specified Method is not supported"

我删除了 dispose 调用以查看会发生什么...此时我得到完全相同的错误

End Sub

因为我认为这几乎是不可能的,所以我尝试重新启动 PC 和 Visual Studio 2012。没有效果。

应该注意的是,如果我跳过错误,图像可以正常工作,但是我相信当页面绘制任何多达 50 个跳过它们的图像时,您会欣赏到这些图像可能会非常耗时,最重要的是如果有任何可能导致图像因此而失败,我相信我的客户不会留下深刻的印象。

【问题讨论】:

    标签: asp.net vb.net ashx notsupportedexception


    【解决方案1】:

    几个建议:

    您应该将 img 和 graphics 的使用包装在 Using 块中,而不是调用显式 dispose。

    您应该刷新并关闭响应流,以确保在释放图像之前使用完毕。

    Public Sub ProcessRequest(ByVal context As System.Web.HttpContext) Implements IHttpHandler.ProcessRequest
        Dim js As New JavaScriptSerializer
        Dim ai As absencestruct = js.Deserialize(Of absencestruct)(CStr(context.Request.QueryString.Item("json")))
    
        'Ensure font is readable (half height of block or 12px whichever is smaller)
        Dim f As Font = New Font("Calibri", Math.Min(CInt(CDbl(ai.size.height) / 2.5), 12), GraphicsUnit.Pixel)
    
        Using img As New Bitmap(CInt(ai.size.width), CInt(ai.size.height))
            Using g As Graphics = Graphics.FromImage(img)
    
                g.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality
    
                If ai.textStyle <> textStyleEnum.invisible Then
                    g.Clear(Color.White)
                End If
    
                Dim r As New Rectangle(1, 1, CInt(ai.size.width) - 1, CInt(ai.size.height) - 1)
    
                r = New Rectangle(r.Left + 2, r.Top + 2, r.Width - 4, r.Height - 4)
    
                drawAbsence(ai, True, r, g)
                If ai.abs2.type <> AbsenceItem.halfDays.Errored AndAlso ai.drawStyle = AbsenceItem.drawStyle.orphan Then
                    drawAbsence(ai, False, r, g)
                End If
    
                Dim s As SizeF = g.MeasureString(ai.day.ToString, f)
                Dim br As SolidBrush = CType(Brushes.Black, SolidBrush)
                If ai.textStyle = textStyleEnum.otherMonth Then br = CType(Brushes.Gray, SolidBrush)
    
                If ai.textStyle <> textStyleEnum.invisible Then
                    g.DrawString(ai.day.ToString, f, br, New Point(CInt((CDbl(ai.size.width) / 2) - CInt(s.Width / 2)), CInt((CDbl(ai.size.height) / 2) - CInt(s.Height / 2))))
                End If
    
                context.Response.ContentType = "image/png"
                img.Save(context.Response.OutputStream, ImageFormat.Png)
                context.Response.Flush()
                context.Response.Close()
            End Using
        End Using
    End Sub
    

    【讨论】:

    • 感谢您的建议,但我知道在 context.Reponse.Flush 调用中得到完全相同的消息...如果我再次跳过该消息,图片实际上呈现得非常好。
    • 这很奇怪。您可以调试并从异常中获取堆栈跟踪以查看它的来源吗?这通常可以帮助我缩小此类奇怪问题的根源。
    猜你喜欢
    • 2011-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-14
    • 1970-01-01
    • 2011-04-11
    相关资源
    最近更新 更多