当我在 IIS7 中将 png 保存到 MemoryStream 时,GDI+ 中出现一般错误

2024-04-01

当我尝试将 png 保存到内存流时出现错误。在我的 ASP.NET 开发服务器上,一切正常,但当我在 IIS7 下运行网站时,会生成错误。另外,当我尝试保存 jpg 格式时,一切都正确。在 IIS 中,我将 .NET 可信级别设置为“完全”。但还是不行。我需要你的帮助。

private static Stream DrawBarChart(IEnumerable<Tuple<string, ulong, double>> data){
using (MemoryStream stream = new MemoryStream())
{
    var canvasWidth = PageSize.A4.Width;
    var canvasHeight = PageSize.A4.Height;

    using (
        System.Drawing.Image bitmap = new Bitmap((int) canvasWidth,
                                                 (int) canvasHeight))
    {
        using (var graphics = Graphics.FromImage(bitmap))
        {
            var penBlack1 = new Pen(Brushes.Black, 1);

            graphics.DrawLine(penBlack1, 0, 0, canvasWidth, 0);
            graphics.DrawLine(penBlack1, 0, 0, 0, canvasHeight);

            graphics.Save();
        }
        bitmap.Save(stream, ImageFormat.Png);

    stream.Flush();
    stream.Position = 0;

    return stream;
    }
}

}


您的代码中至少有 2 个完全独立的问题导致其出现故障。

问题#1:GDI+ 错误

这是一个反复出现的问题,在生态系统中不断出现。 我有它,我设法修复它,但现在我不记得具体是如何修复的。 我尝试复制你的问题,但没有收到失败信息。

我建议你检查这个线程:http://forums.asp.net/t/624305.aspx/1 http://forums.asp.net/t/624305.aspx/1一些人很高兴地通过以下方式克服了这个问题:

  • 确保他们在继续其他绘图之前处理掉所有位图实例
  • (有趣的一个): 做一个GC.Collect()(可能在每次位图渲染之后)

这并不是我想尝试帮助您找到答案的主要原因。 看来你已经做了(你说你做了)我通常做的所有事情,以确保我不会陷入这种情况(安全、信任等)。此外,您自己清理的次数超出了需要的范围(在阅读我的答案时您会发现有点太多了)。

我发现您的代码有第二个问题您可能没有意识到。 通过在我自己的 VS 环境中简单地解决这个问题,我成功地渲染了位图(在 IIS 7 和 Express 以及 ASP 开发服务器中)。

通过在应用程序代码中进行一些组织,您很有可能能够解决问题#1。所以:请看看我对问题 2 的看法。

问题#2:流不能同时释放和返回

您无法返回刚刚创建的流并处置 like:

public static Stream SomeMethod() {
  using (MemoryStream stream = new MemoryStream()) {
    // write something to the stream
    return stream;
  }
}

我真的不明白这段代码在 ASP.NET Development Server 中实际上是如何工作的。 我在这里试图指出的问题是,您的代码总是会抛出 ObjectDisposeException(无论您是将代码作为服务运行还是在交互式用户空间中运行):

谁关闭了流?终止using陈述。

问题 #2 的可能解决方案

解决这个特定问题(可能会使用比您预期更多的内存)的快速解决方案是让您的方法返回 byte[] 而不是流。

public static byte[] SomeMethod() {
  using (MemoryStream stream = new MemoryStream()) {

    // ... create bitmap and render things ...

    // write something to the stream
    bitmap.Save(stream, ImageFormat.Png);

    return stream.ToArray();
  }
}

让我自己对您的应用程序需求做出假设,我想说这个其他解决方案可能会更好:

If您希望将这些生成的图表图像返回到标记回 Web 浏览器,并且您通过 ASP.NET 通用处理程序来完成此操作,然后您可以传递当前 WebResponse 的 OutputStreamto您的绘图方法,而不是采用结果 byte[] (或 Stream)from它,就像这样:

In HTML:

<img src="path/Foo.ashx" alt="chart" ... etc ... />

在应用程序中时:

public class Foo : IHttpHandler {
  public void ProcessRequest(HttpContext context) {

   context.Response.ContentType = "application/octet-stream";
   Stream alreadyExistingStream = context.Response.OutputStream;

   Etc.SomeMethod(stream);       
  }
}

public class Etc {

public static void SomeMethod(Stream stream) {
  // There used to be a using here that would create a stream
    // simply because the parameter name **stream** is the same as the former local var's name
    // the instructions that do the drawing of things 
    // + saving of the resulting Bitmap **to** the stream
    // keep on compiling without any problems

    // draw things to a bitmap
    // write the bitmap to the stream
    bitmap.Save(stream, ImageFormat.Png);

    // returning stuff is not needed anymore
  // This used to be the time and place where the stream would be disposed
  // and it's resources given back to the community
}

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当我在 IIS7 中将 png 保存到 MemoryStream 时,GDI+ 中出现一般错误 的相关文章

  • MVC2 中隐藏字段的替代方案

    我有一个 viewModel 其中包含一个在传递给部分视图之前填充的字符串 我需要能够在发布表单时取回数据 目前我已经创建了一个隐藏字段并将数据绑定到它 然后 当回发时 我可以从表单集合中获取数据 这并不完全是我想要的 我希望数据完全隐藏在
  • CSS、Javascript 和图像的长度为零

    我正在尝试将 ASP NET MVC 1 0 Visual Studio 2008 项目移植到 ASP NET MVC RC 2 Visual Studio 2010 该项目 并且一直 在 IIS 7 上运行 动态内容 由控制器提供的所有内
  • C# 转换为小数

    如果有的话 有什么区别 decimal d decimal myDouble decimal d new decimal myDouble decimal d Convert ToDecimal myDouble 没有区别 如果你看一下源码
  • 如何将 Integer8 值转换为 DateTime?

    如何将 Integer8 类型值转换为 DateTime 类型值 特别是 我正在尝试获得帐户过期采用人类可读形式的 Active Directory 用户属性 SearchResult GetDirectoryEntry Propertie
  • 如果.Net Core可以在Windows上运行,为什么不能在.Net Framework中引用.Net Core DLL?

    我明白为什么 Net Framework 可能会在 Net Core IE 中导致问题 因为不存在特定于 Windows 平台的 API 但是为什么不能直接引用 Net Core 作为 Net Framework 中的库呢 如果 Net C
  • 事件日志写入错误

    很简单 我想向事件日志写入一些内容 protected override void OnStop TODO Add code here to perform any tear down necessary to stop your serv
  • string.Compare 行为

    怎么会这样呢 这是从VS2008中的立即窗口获取的 string Compare 1 string Compare 0 0 1 从言论来看字符串比较 http msdn microsoft com en us library 84787k2
  • 过期时自动重新填充缓存

    我当前缓存方法调用的结果 缓存代码遵循标准模式 如果存在 则使用缓存中的项目 否则计算结果 在返回之前将其缓存以供将来调用 我想保护客户端代码免受缓存未命中的影响 例如 当项目过期时 我正在考虑生成一个线程来等待缓存对象的生命周期 然后运行
  • 过度使用委托对性能来说是一个坏主意吗? [复制]

    这个问题在这里已经有答案了 考虑以下代码 if IsDebuggingEnabled instance Log GetDetailedDebugInfo GetDetailedDebugInfo 可能是一个昂贵的方法 因此我们只想在调试模式
  • 添加 LINQ 的 LongCount 扩展方法是否有实际原因?

    LINQ 有 2 种计算可枚举数的方法 Count and LongCount 实际上 这两者之间的唯一区别是第一个返回一个int 而第二个返回一个long 我不清楚为什么添加第二种方法 它的唯一用例似乎是处理超过 2B 元素的枚举 对我来
  • 应用服务中的内存利用率是否可​​以提高

    我有一个相当简单的 Web 应用程序在 Azure 的 B1 服务计划中的应用服务计划中运行 该计划提供 1 个 CPU 和 1 75GB RAM CPU 使用率永远不会超过 5 左右 内存使用率永远不会低于 52 我确实停止了计划中唯一运
  • 是否可以调整AppFabric缓存服务器来存储更大的对象?

    当我假设将较大的对象图添加到缓存中时 我收到 AppFabric 缓存服务器错误 错误代码 子状态 连接已终止 可能是由于服务器或网络问题或序列化对象大小大于服务器上的 MaxBufferSize 请求的结果未知 我确信这不是网络问题 我能
  • 使用 DependencyResolver 通过 MVC 3 进行控制器实例化时出错

    我正在使用 MVC 3 并在应用程序启动时使用以下代码 UnityContainer container new UnityContainer new UnityMappings container DependencyResolver S
  • 如何使用AutoMapper按照类中定义的顺序映射对象?

    给定这两个对象 我使用非常不同的对象来更好地阐明 public class Car public string Brand get set public int Speed get set public class Apple public
  • 如何在 wpf 应用程序的代码隐藏中创建集合视图源

    我有以下代码 public partial class MainWindow Window public MainWindow InitializeComponent var entities new DemoEntities var de
  • MySQL - 多个结果集

    我正在使用 NET Connector 连接到 MySQL 在我的应用程序中 很少有线程使用相同的连接 因此如果 MySQLDataReader 尚未关闭并且某个线程正在尝试执行查询 则会出现该错误 已经有一个打开的 DataReader
  • 如何使 Windows 窗体的关闭按钮不关闭窗体但使其不可见?

    该表单有一个 NotifyIcon 对象 当用户单击 关闭 按钮时 我希望表单不关闭而是变得不可见 然后 如果用户想再次查看该表单 可以双击系统托盘中的图标 如果用户想关闭表单 可以右键单击该图标并选择 关闭 有人可以告诉我如何使关闭按钮不
  • 什么可以解释托管堆上超过 5,000,000 个 System.WeakReference 实例?

    我一直在针对生产 ASP NET Web 应用程序运行负载测试 并且看到在堆上创建了大量 System WeakReference 在大约 15 分钟内 负载管理堆内存已飙升至大约 3GB 并且我有大约 5 000 000 个对 Syste
  • .Net应用程序设置路径

    默认情况下 Windows 应用程序设置保存在该目录中 USERPROFILE Local Settings Application Data
  • 恢复上传文件控制

    我确实阅读了以下帖子 C 暂停 恢复上传 https stackoverflow com questions 1048330 pause resume upload in c 使用 HTTP 恢复上传 https stackoverflow

随机推荐