OpenXML, IsolatedStorage, СЕТЕВАЯ СЛУЖБА и Windows Server 2008

У меня есть большое веб-приложение. Одна очень маленькая часть этого веб-приложения генерирует файлы XLSX с использованием библиотеки OpenXML (написанной на C#).

Я столкнулся с проблемой, описанной в этом посте: Отказано в доступе к IsolatedStorage

Однако инструкции есть для Windows Server 2003, а иерархия каталогов пользователей в 2008 другая.

Я попытался создать каталог IsolatedStorage в этих местах (а затем предоставить ему разрешения NETWORK SERVICE):

C:\Users\Default\AppData\Local\IsolatedStorage C:\Users\Default\AppData\Roaming\IsolatedStorage

Это не сработало. Я безуспешно пытался найти подходящее место для каталога IsolatedStorage в Windows Server 2008 (обычно с помощью Google и, в частности, здесь).

Может ли кто-нибудь сказать мне, где я должен создать этот каталог (или, альтернативно, предложить другое решение, которое заставит OpenXML указать архивной библиотеке не использовать IsolatedStorage для создания электронной таблицы)?

Редактировать — 14 июля 2011 г. — Добавлено сообщение об исключении и трассировка стека, чтобы помочь другим найти это.

Exception: System.ApplicationException
Message: Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))
Source: mscorlib
   at System.IO.IsolatedStorage.IsolatedStorageFile.nGetRootDir(IsolatedStorageScope scope)
   at System.IO.IsolatedStorage.IsolatedStorageFile.InitGlobalsNonRoamingUser(IsolatedStorageScope scope)
   at System.IO.IsolatedStorage.IsolatedStorageFile.GetRootDir(IsolatedStorageScope scope)
   at System.IO.IsolatedStorage.IsolatedStorageFile.GetGlobalFileIOPerm(IsolatedStorageScope scope)
   at System.IO.IsolatedStorage.IsolatedStorageFile.Init(IsolatedStorageScope scope)
   at System.IO.IsolatedStorage.IsolatedStorageFile.GetStore(IsolatedStorageScope scope, Type domainEvidenceType, Type assemblyEvidenceType)
   at MS.Internal.IO.Packaging.PackagingUtilities.ReliableIsolatedStorageFileFolder..ctor()
   at MS.Internal.IO.Packaging.PackagingUtilities.GetDefaultIsolatedStorageFile()
   at MS.Internal.IO.Packaging.PackagingUtilities.CreateUserScopedIsolatedStorageFileStreamWithRandomName(Int32 retryCount, String& fileName)
   at MS.Internal.IO.Packaging.SparseMemoryStream.EnsureIsolatedStoreStream()
   at MS.Internal.IO.Packaging.SparseMemoryStream.SwitchModeIfNecessary()
   at MS.Internal.IO.Zip.ZipIOFileItemStream.Write(Byte[] buffer, Int32 offset, Int32 count)
   at System.IO.Compression.DeflateStream.InternalWrite(Byte[] array, Int32 offset, Int32 count, Boolean isAsync)
   at System.IO.Compression.DeflateStream.Write(Byte[] array, Int32 offset, Int32 count)
   at MS.Internal.IO.Packaging.CompressStream.Write(Byte[] buffer, Int32 offset, Int32 count)
   at MS.Internal.IO.Zip.ProgressiveCrcCalculatingStream.Write(Byte[] buffer, Int32 offset, Int32 count)
   at MS.Internal.IO.Zip.ZipIOModeEnforcingStream.Write(Byte[] buffer, Int32 offset, Int32 count)
   at System.Xml.XmlUtf8RawTextWriter.FlushBuffer()
   at System.Xml.XmlUtf8RawTextWriter.WriteAttributeTextBlock(Char* pSrc, Char* pSrcEnd)
   at System.Xml.XmlUtf8RawTextWriter.WriteString(String text)
   at System.Xml.XmlWellFormedWriter.WriteString(String text)
   at DocumentFormat.OpenXml.OpenXmlElement.WriteAttributesTo(XmlWriter xmlWriter)
   at DocumentFormat.OpenXml.OpenXmlElement.WriteTo(XmlWriter xmlWriter)
   at DocumentFormat.OpenXml.OpenXmlCompositeElement.WriteContentTo(XmlWriter w)
   at DocumentFormat.OpenXml.OpenXmlElement.WriteTo(XmlWriter xmlWriter)
   at DocumentFormat.OpenXml.OpenXmlCompositeElement.WriteContentTo(XmlWriter w)
   at DocumentFormat.OpenXml.OpenXmlElement.WriteTo(XmlWriter xmlWriter)
   at DocumentFormat.OpenXml.OpenXmlCompositeElement.WriteContentTo(XmlWriter w)
   at DocumentFormat.OpenXml.OpenXmlPartRootElement.WriteTo(XmlWriter xmlWriter)
   at DocumentFormat.OpenXml.OpenXmlPartRootElement.SaveToPart(OpenXmlPart openXmlPart)
   at DocumentFormat.OpenXml.Packaging.OpenXmlPackage.SavePartContents()
   at DocumentFormat.OpenXml.Packaging.OpenXmlPackage.Dispose(Boolean disposing)
   at DocumentFormat.OpenXml.Packaging.OpenXmlPackage.Close()

person Jeremy Clifton    schedule 13.07.2011    source источник
comment
Я ничего не получаю, пытаясь создать каталоги и воссоздать решение в сообщении блога, на которое я ссылался выше. Похоже, у меня есть варианты либо уменьшить размер файла, либо посмотреть, есть ли способ заставить OpenXML создать экземпляр архивной библиотеки таким образом, чтобы он не переключался на IsolatedStorage.   -  person Jeremy Clifton    schedule 14.07.2011
comment
Не удалось найти способ запретить OpenXML использовать IsolatedStorage. Я смог использовать ILSpy, чтобы увидеть, где он выбирает, использовать его или нет, но я не вижу очевидного способа изменить highwatermark var, который он использует для переключения между MemoryStream и IsolatedStorage. Я нашел конкретный профиль, который использует учетная запись NETWORK SERVICE на Win Server 2008 — это C:\Windows\ServiceProfiles\NetworkService, но даже создание там папок IsolatedStorage не помогает.   -  person Jeremy Clifton    schedule 14.07.2011
comment
вы уверены, что видите ту же проблему? в Windows 2008 пулы приложений по умолчанию используют учетную запись удостоверения пула приложений, которая не имеет записи в HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList, поэтому проблема вообще не возникала для нас в 2008 году. Если вы' повторно используя сетевую службу в Windows 2008, возможно, вы могли бы вернуться к настройке удостоверения пула приложений по умолчанию.   -  person Andy    schedule 17.01.2012
comment
Мы используем сетевой сервис для этого конкретного приложения. Честно говоря, я не знаю точно, почему, но я понимаю, что была веская причина, по которой был сделан выбор, когда все было настроено.   -  person Jeremy Clifton    schedule 01.03.2012


Ответы (2)


Во время своего исследования я также наткнулся на этот пост в блоге: http://www.kevinrohrbaugh.com/blog/tag/openxml

Сначала я отклонил его, так как мое приложение не может выдавать себя за другого пользователя из-за того, как оно взаимодействует с другим веб-приложением, над которым я не контролирую.

Однако я подумал, что, возможно, если бы я избавился от записи реестра для NETWORK SERVICE в ProfileList, я мог бы получить тот же результат.

Итак, я переименовал HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\S-1-5-20 в HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\S-1-5-20-backup и повторно запустил мой экспорт в Excel, и он работает правильно. Насколько я могу судить, у меня нет никаких отрицательных результатов от этого.

person Jeremy Clifton    schedule 14.07.2011

[Я бы добавил это как комментарий, но у меня нет разрешения...]

Я надеюсь, что это поможет кому-то еще...

У меня есть приложение, работающее в IIS Express в качестве сетевой службы на Windows Server 2008 R2. Хранилище изолированного хранилища, возвращаемое вызовом IsolatedStorageFile.GetMachineStoreForDomain(), расположено по адресу: c:\ProgramData\IsolatedStorage.

person jtbennett    schedule 09.12.2012