1

我正在.NET4中编写一个程序,它以这种方式生成内存映射文件:MemoryMappedFile.CreateNew("TEST", int.MaxValue))

我创建了安装在 IIS7 上的 ISAPI 模块,该模块将读取 MemoryMappedFile 但不幸的是它不起作用,我收到错误:System.IO.FileNotFoundException:无法找到指定的文件。

该程序与 IIS7 在同一台 PC 上,IIS 与我的程序在同一用户上工作。如果我将代码从 ISAPI 放到另一个程序中,我可以毫无问题地读取 MemoryMappedFile。

当我在 ASP.NET 中使用我的代码(读取 MemoryMappedFile)时,也会出现同样的问题。看起来 IIS 在系统应用程序和 ISAPI 或 ASP.NET 之间阻止了 MemoryMappedFile。

如何解决?MemoryMappedFile 对我很重要。

谢谢

4

2 回答 2

2

在无法查看相关代码的情况下,我可以建议一些调查途径:

  • 您确定在您尝试通过 ISAPI 扩展访问它时该句柄仍然存在吗?如果创建文件的进程不再运行,它将被垃圾收集并且不会被发现。您可以使用 Process Explorer (http://technet.microsoft.com/en-us/sysinternals/bb896653) 来搜索您的内存映射文件(它将显示为“节”类型的句柄)。

  • 如果这不起作用,请尝试让您的 ISAPI 扩展分配它自己的内存映射文件,看看它是否可以读取它自己的文件。

  • 尝试为内存映射文件分配较低的容量 - 如您的示例中那样将容量设置为 4 GB 可能是问题所在。

于 2011-02-16T05:05:38.367 回答
0

问题可能是命名空间问题,是尝试在两个会话之间按名称共享同一个内存映射文件的结果。由于 IIS 作为服务运行,它在“会话 0”中运行,而其他用户应用程序将在不同的交互式会话中运行。每个会话都有自己的命名资源命名空间(如内存映射文件)。

尝试在文件名前添加“Global\”,例如:

MemoryMappedFile.CreateNew(@"Global\TEST", int.MaxValue))
于 2015-10-06T20:17:00.283 回答