首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Windows或ASP.NET服务中的System.Drawing

Windows或ASP.NET服务中的System.Drawing
EN

Stack Overflow用户
提问于 2008-12-24 00:57:15
回答 5查看 13.6K关注 0票数 17

根据MSDN的说法,在Windows服务或ASP.NET服务中使用System.Drawing命名空间中的类并不是一个特别好的主意。现在我正在开发一个类库,它可能需要访问这个特定的名称空间(用于测量字体),但不能保证宿主进程不是一个服务。

现在,如果System.Drawing不可用,我可以使用一种不太理想的方法,但如果可能,我宁愿使用System.Drawing中的类。因此,我想要做的是在运行时确定System.Drawing是否安全,如果安全,就使用它,否则就退回到次优选项。

我的问题是:我怎么才能检测到使用System.Drawing是否安全呢?

我想我也应该

  • 检测当前进程是Windows服务还是ASP.NET服务
  • 检测GDI是否可用
  • 或者是否有一种方法可以询问System.Drawing.dll本身使用

是否安全

不幸的是,我想不出一种方法来实现这些方法。有谁知道吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2008-12-24 02:27:47

为了澄清任何混淆,System.Drawing可以在ASP.NET和服务下工作,只是不受支持。可能会出现高负载(耗尽非托管资源)、内存或资源泄漏(实现不佳或称为处置模式)和/或在没有桌面显示对话框时弹出对话框的问题。

测试将处理后者,而监控将提醒您注意前者。但是,如果/当你遇到问题时,不要期望能够呼叫PSS并要求修复。

那么,你有什么选择?好吧,如果你不需要一个完全支持的路由,并且你不期望极端的负载-很多人已经忽略了MSDN的警告,并成功地使用了System.Drawing。他们中的一些人被咬了,但成功的故事比失败的故事多得多。

如果你想要一些支持,那么你需要知道你是否正在交互运行。就我个人而言,我可能只会让托管应用程序在某个地方设置一个非交互式标志。毕竟,应用程序处于最佳位置来确定它们是否在托管环境中和/或想要冒GDI+问题的风险。

但是,如果你想自动检测你的环境,我想有比为服务提供right here on SO更糟糕的答案。总之,您可以检查EntryAssembly以查看它是否继承自ServiceBase,或者尝试访问System.Console。对于ASP.NET,按照同样的思路,检测HttpContext.Current应该就足够了。

我认为会有一种托管或p/invoke的方式来寻找桌面(我认为这是所有这一切的决定性因素)和/或AppDomain之外的东西,这会给你提供线索。但我不确定它是什么,MSDN对此缺乏启发性。

编辑:浏览MSDN时,我回想起它实际上是一个Window Station (托管桌面),这才是这里的重点。有了这些信息,我就能够找到GetProcessWindowStation(),它返回当前窗口站的句柄。将该句柄传递给GetUserObjectInformation()将得到一个USEROBJECTFLAGS结构,如果您有一个可见的桌面,那么它应该有一个带有WSF_VISIBLE的dwFlags。

或者,EnumWindowsStations会给你一个可以查看的电台列表-- WinSta0是交互式的。

但是,是的,我仍然认为让应用程序设置一个属性或其他东西是更容易的方法……

再次编辑:7年后,我进入了Environment.UserInteractive,上面我为你描述了MS does the exact GetProcessWindowStation dance的地方……我仍然建议委托主机应用程序(他们可能想要更快,但略有风险的System.Drawing路径),但UserInteractive似乎是一个很好的默认设置,而不是让它自己调用它。

票数 19
EN

Stack Overflow用户

发布于 2010-06-19 02:34:03

尽管没有得到官方的支持,但多年来我在高容量web服务器( web应用程序和web服务)上广泛使用了System.Drawing类,没有造成任何性能或可靠性问题。

我认为确定代码是否可以安全使用的唯一方法是使用{}语句测试、监视和包装任何具有外部资源的对象。

票数 4
EN

Stack Overflow用户

发布于 2008-12-24 01:10:18

您可以改用TextRenderer。我知道在ASP.NET中使用来自System.Windows.Forms的东西有点奇怪,但它似乎没有关于ASP.NET不支持的相同警告。我使用过TextRenderer和Graphics.MeasureString来测量ASP.NET应用程序中的字符串,所以它们都可以工作。我从来没有在ASP.NET中看到过关于System.Drawing不可取的警告。

TextRenderer比Graphics.MeasureString慢得多。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/390532

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档