在IIS中部署时,打开内存映射文件会导致FileNotFoundException

Sau*_*ers 7 .net asp.net iis ipc memory-mapped-files

按照网站的代码示例,我创建了一个创建映射内存文件的Windows控制台应用程序:

        using (var file = MemoryMappedFile.CreateNew("myFile", 24))
        {
            var bytes = new byte[24];
            for (var i = 0; i < bytes.Length; i++)
                bytes[i] = (byte)(65 + i);

            using (var writer = file.CreateViewAccessor(0, bytes.Length))
            {
                writer.WriteArray<byte>(0, bytes, 0, bytes.Length);
            }
            Console.WriteLine("Run memory mapped file reader before exit");
            Console.WriteLine("Press any key to exit ...");
            Console.ReadLine();
        }
Run Code Online (Sandbox Code Playgroud)

在一个新的asp.net Web应用程序中,我使用代码读取了MMF:

 protected void Page_Load(object sender, EventArgs e)
    {
        string sOutput = "";

        using (var file = MemoryMappedFile.OpenExisting("myFile"))
        {
            using (var reader = file.CreateViewAccessor(0, 24))
            {
                var bytes = new byte[24];
                reader.ReadArray<byte>(0, bytes, 0, bytes.Length);

                for (var i = 0; i < bytes.Length; i++)
                    sOutput += (char)bytes[i] + " ";

            }
        }

        Response.Write(sOutput);
    }
Run Code Online (Sandbox Code Playgroud)

在开发IIS Express中,文件按预期读取,页面显示映射内存文件中的数据.

但是,当部署到IIS时,我System.IO.FileNotFoundException在该位置获得异常MemoryMappedFile.OpenExisting("myFile")

我尝试将应用程序池标识更改为与运行MMF控制台应用程序的标识相同,但这确实不起作用.

小智 3

在地图名称中添加“Global\\”前缀。这是对我有用的唯一方法。当我们尝试访问第一个进程中创建的共享内存时,它在不同的安全上下文中运行,并且共享内存对象不可见,除非它们是在全局命名空间中创建的。

这是对我有用的代码。我在 WinForm 应用程序中使用 CreateOrOpen,在 IIS 进程中使用 OpenExisting:

mSec = new MemoryMappedFileSecurity();
mSec.AddAccessRule(new AccessRule<MemoryMappedFileRights>(new SecurityIdentifier(WellKnownSidType.WorldSid, null), MemoryMappedFileRights.FullControl, AccessControlType.Allow));

mmf = MemoryMappedFile.CreateOrOpen("Global\\\MmfName", 100, MemoryMappedFileAccess.ReadWrite, MemoryMappedFileOptions.None, mSec, HandleInheritability.Inheritable);

mmf = MemoryMappedFile.OpenExisting("Global\\\MmfName");
Run Code Online (Sandbox Code Playgroud)