我对ASP.NET还比较陌生,但是我已经用C#开发了很多WinForms应用程序,在这些应用程序中,我广泛使用System.Drawing.Bitmap
命名空间而没有遇到太多问题。
今天,我决定在我的Page_Load事件中编写一些代码来动态创建一些PNG文件,并且一切似乎都很正常。但是我注意到微软文档网站上出现了这个看起来很可怕的warning。这是怎么回事??
我不知道除了使用System.Drawing.Bitmap
之外还有其他处理图像的方法... 我感到困惑:(
我对ASP.NET还比较陌生,但是我已经用C#开发了很多WinForms应用程序,在这些应用程序中,我广泛使用System.Drawing.Bitmap
命名空间而没有遇到太多问题。
今天,我决定在我的Page_Load事件中编写一些代码来动态创建一些PNG文件,并且一切似乎都很正常。但是我注意到微软文档网站上出现了这个看起来很可怕的warning。这是怎么回事??
我不知道除了使用System.Drawing.Bitmap
之外还有其他处理图像的方法... 我感到困惑:(
<%@ WebHandler Language="C#" Class="ImageHandler" %>
using System;
using System.IO;
using System.Web;
using System.Drawing;
using System.Drawing.Imaging;
using System.Drawing.Drawing2D;
public class ImageHandler : IHttpHandler
{
public void ProcessRequest (HttpContext context)
{
Bitmap output = new Bitmap(path);
// Do lots of fun stuff here related to image
// manipulation and/or generation
...
context.Response.ContentType = ResponseType("Image/png");
// Send image to the browser
image.Save(context.Response.OutputStream, ImageType(path));
// Be careful to clean up; you could put this inside a 'using' block
image.Dispose();
}
public bool IsReusable
{
get { return true; }
}
}
将您的代码放在HttpHandler中,您就能更接近于完美。无论如何,它肯定会更快地提供您的图片,并允许您处理更多的请求...此外,您还可以学习更多的框架知识;-)
我认为这是出于法律原因,作为“自行承担风险,不要因为您的Web服务器停机而责怪我们的库”的声明。
但是我之前在这样的环境中使用过它,并没有遇到任何问题。
GDI+在ASP.NET下大部分情况都能工作,尽管文档中有警告,但在重负载(100,000+图片)下可能会遇到问题,包括似乎无原因抛出异常,当您重试相同操作时,它却正常工作。
在这种情况下唯一的解决方法是运行独立的渲染进程,它们经常被回收,使用MSMQ与ASP.NET通信。对于低流量站点,我怀疑您不会遇到任何问题。
您确实需要正确丢弃位图,并避免使用Image.FromFile()
,因为它存在问题。请参见http://blog.abodit.com/2010/07/gdi-image-fromfile-problem/