Отображенный в память файл в ISAPI или ASP.NET - FileNotFoundException - PullRequest
1 голос
/ 15 февраля 2011

Я пишу программу в .NET4, которая генерирует файлы с отображением в памяти следующим образом: MemoryMappedFile.CreateNew ("TEST", int.MaxValue))

Я создал модуль ISAPIкоторый установлен на IIS7, этот модуль будет читать MemoryMappedFile, но, к сожалению, он не работает, я получаю сообщение об ошибке: System.IO.FileNotFoundException: невозможно найти указанный файл.

Программанаходится на том же компьютере, что и IIS7, IIS работает на том же пользователе, что и моя программа.Если я помещу свой код из ISAPI в другую программу, и я смогу прочитать MemoryMappedFile без каких-либо проблем.

Та же проблема возникает, когда я использую свой код (который читает MemoryMappedFile) в ASP.NET.Похоже, IIS заблокировал MemoryMappedFile между приложением системы и ISAPI или ASP.NET.

Как решить эту проблему?MemoryMappedFile важен для меня.

Спасибо

Ответы [ 2 ]

2 голосов
/ 16 февраля 2011

Не имея возможности взглянуть на рассматриваемый код, я могу предложить несколько путей исследования:

  • Вы уверены, что дескриптор все еще существует в то время, когда вы пытаетесь получить доступ?это через расширение ISAPI?Если процесс, который создал файл, больше не работает, он будет собирать мусор и не будет найден.Вы можете использовать Process Explorer (http://technet.microsoft.com/en-us/sysinternals/bb896653) для поиска файла, отображенного в памяти (он будет отображаться как дескриптор типа «section»).

  • Если это не сработает,попробуйте, чтобы ваше расширение ISAPI выделило свой собственный отображенный в память файл, и посмотрите, может ли оно читать свои собственные файлы.

  • Попробуйте выделить меньшую емкость для отображаемого в память файла - установите емкость на 4ГБ, как в вашем примере, может быть проблемой.

0 голосов
/ 06 октября 2015

Возможно, проблема связана с пространством имен, в результате попытки совместно использовать один и тот же отображенный в памяти файл по имени между двумя сеансами.Поскольку IIS работает как служба, он выполняется в «сеансе 0», тогда как другие пользовательские приложения будут работать в другом интерактивном сеансе.Каждый сеанс имеет свое собственное пространство имен для именованных ресурсов (например, отображаемых в памяти файлов).

Попробуйте добавить «Global \» к имени файла, например:

MemoryMappedFile.CreateNew(@"Global\TEST", int.MaxValue))
...