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

时间:2013-12-03 23:28:40

标签: asp.net .net iis ipc memory-mapped-files

按照this网站的代码示例,我创建了一个创建映射内存文件的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();
        }

在新的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);
    }

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

但是,当部署到IIS时,我在System.IO.FileNotFoundException

位置获得例外MemoryMappedFile.OpenExisting("myFile")

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

3 个答案:

答案 0 :(得分:2)

如果您正在尝试实现进程间通信(IPC),则可以将WCF与命名管道绑定一起使用。您可以通过一些性能来获得很多简单性。

答案 1 :(得分:2)

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

这是适合我的代码。我在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");

答案 2 :(得分:1)

对于非物理文件,有两种情况,

  1. 您的流程退出后会删除文件。
  2. IIS与控制台进程不在同一用户中运行,IIS在极少数限制模式下运行,因此除非您创建具有附加安全性的文件以允许进程访问您的服务。
  3. 您必须使用http://msdn.microsoft.com/en-us/library/dd267529(v=vs.110).aspx此构造函数以及以下安全性。

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

    然后尝试从IIS以相同的安全性访问它。