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)
| 归档时间: |
|
| 查看次数: |
3399 次 |
| 最近记录: |