w3wp.exe (пользователь NETWORK SERVICE) блокирует вновь созданный файл и запрещает доступ к нему - PullRequest
3 голосов
/ 14 декабря 2011

У меня есть веб-приложение.Он отправляет серию изображений на сервер (без проблем), а затем использует код из этого руководства для создания презентации PowerPoint.Презентация сохраняется в каталоге на веб-сервере, и пользователю возвращается URL-адрес.

Однако файл все еще используется, и при попытке доступа к нему в IIS 7.5 возникает ошибка 500.0.

Если я открою диспетчер задач и уничтожу процесс w3wp.exe, принадлежащий пользователю NETWORK SERVICE, все будет работать так, как задумано (файл можно скачать и просмотреть).У меня также есть другой процесс w3wp, принадлежащий DefaultAppPool, но он, похоже, не вызывает проблемы.

Я новичок в этом .Net кодировании, поэтому вполне возможно, что я забыл закрыть что-то в коде.Любые идеи?

Редактировать : Это метод, который создает серии PNG из данных изображения, которые закодированы в строку.Он использует Guid для создания уникального бита пути к каталогу и проверяет, чтобы он не существовал, а затем создает каталог и помещает туда изображения.

Похоже, что это оскорбительный метод:

Итак, этот метод оскорбления таков:

    public void createImages(List<String> imageStrings)
    {
        UTF8Encoding encoding = new UTF8Encoding();
        Decoder decoder = encoding.GetDecoder();

        Guid id = Guid.NewGuid();
        String idString = id.ToString().Substring(0, 8);

        while (Directory.Exists(imageStorageRoot + idString))
        {
            id = Guid.NewGuid();
            idString = id.ToString().Substring(0, 8);
        }

        String imageDirectoryPath = imageStorageRoot + idString + "\\";
        DirectoryInfo imagePathInfo = Directory.CreateDirectory(imageDirectoryPath);

        for (int i = 0; i < imageStrings.Count; i++)
        {
            String imageString = imageStrings[i];
            Byte[] binary = Convert.FromBase64String(imageString);

            using (FileStream stream = new FileStream(imageDirectoryPath + idString + i.ToString() + ".png", FileMode.Create))
            {
                using (BinaryWriter writer = new BinaryWriter(stream))
                {
                    writer.Write(binary);
                }
            }
        }
    }

Редактировать 2 : Если есть что-то лучше, пожалуйста, дайте мне знать.Я пытаюсь учиться здесь!

Редактировать 3 : Итак, после дальнейшего изучения я могу закомментировать весь этот код.Фактически, второй экземпляр w3wp.exe запускается, как только браузер заходит на сайт.Теперь мне интересно, может ли это быть как-то связано с нашим стеком?Это приложение Flex, которое использует WebOrb для удаленного взаимодействия с некоторыми классами C #.

Кто-нибудь знает, почему этот второй открытый экземпляр w3wp.exe (принадлежащий NETWORK SERVICE) препятствует правильному открытию файла?Есть ли какой-нибудь способ заставить его освободить этот файл?

Ответы [ 2 ]

3 голосов
/ 14 декабря 2011

Убедитесь, что вы закрыли файл после его использования (еще лучше, чтобы код, который обращается к вашим файлам, использовался в выражениях). Отправьте код, если вам нужна помощь, чтобы выяснить, где проблема.

0 голосов
/ 15 декабря 2011

Образец выглядит хорошо. Вы отклонились от структуры кода?

 using (Package pptPackage = 
    Package.Open(fileName, FileMode.Open, FileAccess.ReadWrite))
  {
       // your code goes inside there
  }

Если ваш код содержит оператор using, с вами все будет в порядке. Если вы не добавите вызов Dispose к вашему объекту Package, когда вы закончите, или вы оставите файл открытым на долгое время, пока (возможно) финализатор не убьет его.

...