【问题标题】:Cannot instantiate delphi written application.exe using IIS, MVC4, C# and COM无法使用 IIS、MVC4、C# 和 COM 实例化 delphi 编写的 application.exe
【发布时间】:2014-08-11 04:29:08
【问题描述】:

我的 Web 应用程序是名为 MyApplication.exe 的桌面应用程序的 Web 界面。我的 Web 应用程序是用 C# (MVC4) 编写的,它通过 COM-Objects 与 MyApplication.exe(用 delphi 编写)进行通信。

当 16 个客户端通过浏览器调用 Web 应用时,将在服务器上创建 16 个 MyApplication.exe 实例:

我的问题:如果 17 号客户端调用 Web 应用程序,我的事件日志中会出现以下异常:

“系统错误。代码:8。没有足够的存储空间来处理此命令。”

进程资源管理器指出,工作进程 w3wp.exe 消耗约 600 MB 内存,但机器有 4 GB RAM。

注意:创建的实例将保存在会话(inProc)中。

我正在使用:

  1. MVC4
  2. ASP.NET CLR 4.0
  3. IIS 8
  4. Windows Server 2012 R2(也出现在 Windows 8.1 上)
  5. 4GB 内存

我尝试了以下方法:

  1. 使用 COM 对象通过 VB 脚本在本地创建实例。结果:我能够毫无问题地创建约 50 个 MyApplication.exe 实例。

  2. 使用以下条目调整 machine.config:

    processModel enable="true" memoryLimit="100"

结果:重启worker进程后,问题依旧。

【问题讨论】:

  • 专业提示:检查您正在使用的线程/句柄的数量......
  • @whosrdaddy:你能具体说明你的评论吗?什么线程,在哪里可以查看线程数,在哪里可以更改?

标签: asp.net delphi iis com iis-8


【解决方案1】:

根据用户运行的 IIS 可能是一个问题,其中非交互式桌面堆大小是一个问题。我遇到了这个涉及 Windows 服务的问题。

当您运行您的测试应用程序时,您很可能是在不同的用户下运行的。您可以尝试在注册表中调整非交互式桌面堆大小,看看是否可以解决此问题:

以下取自KB 126962

要解决此问题,请增加桌面堆的大小:运行 注册表编辑器 (Regedt32.exe)。从 HKEY_LOCAL_MACHINE 子树中, 转到以下键:\System\CurrentControlSet\Control\Session Manager\SubSystems 选择 Windows 值。从编辑菜单中, 选择字符串。增加 SharedSection 参数。

对于 Windows NT:SharedSection 指定系统和桌面堆 使用以下格式:SharedSection=xxxx,yyyy 添加“,256”或 yyyy 数字后的“,512”。

对于 Windows 2000、Windows XP 和 Windows Server 2003:SharedSection 使用以下格式指定系统和桌面堆: SharedSection=xxxx,yyyy,zzzz 对于 32 位操作系统,增加 yyyy 值为“12288”;将 zzzz 值增加到“1024”。为了 64位操作系统,增加yyyy值为“20480”;增加 zzzz 值改为“1024”。

这里也是windows vista/7的类似文章KB 947246

【讨论】:

  • 在我的 Windows 8.1 机器上,我设置了“SharedSection=2048,20480,2048”,它现在可以工作了。非常感谢!
猜你喜欢
  • 2010-09-27
  • 1970-01-01
  • 2010-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-14
  • 2012-04-10
  • 1970-01-01
相关资源
最近更新 更多