OpenXml和Unable无法创建互斥锁

时间:2013-10-19 11:40:35

标签: c# .net excel ms-office openxml

我尝试通过openXml lib创建Excel文档,但是当我想从大量数据创建Excel时,服务器让我无法创建互斥锁。 (来自HRESULT的异常:0x80131464)错误, 堆栈跟踪是:

[IsolatedStorageException: Unable to create mutex. (Exception from HRESULT: 0x80131464)]
   System.IO.IsolatedStorage.IsolatedStorageFile.Open(String infoFile, String syncName) +0
   System.IO.IsolatedStorage.IsolatedStorageFile.Lock(Boolean& locked) +370
   System.IO.IsolatedStorage.IsolatedStorageFileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, IsolatedStorageFile isf) +468
   System.IO.IsolatedStorage.IsolatedStorageFileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, IsolatedStorageFile isf) +35
   MS.Internal.IO.Packaging.SafeIsolatedStorageFileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, ReliableIsolatedStorageFileFolder folder) +102
   MS.Internal.IO.Packaging.PackagingUtilities.CreateUserScopedIsolatedStorageFileStreamWithRandomName(Int32 retryCount, String& fileName) +276
   MS.Internal.IO.Packaging.SparseMemoryStream.EnsureIsolatedStoreStream() +31
   MS.Internal.IO.Packaging.SparseMemoryStream.SwitchModeIfNecessary() +400
   MS.Internal.IO.Packaging.CompressEmulationStream.Write(Byte[] buffer, Int32 offset, Int32 count) +76
   MS.Internal.IO.Packaging.CompressStream.Write(Byte[] buffer, Int32 offset, Int32 count) +431
   MS.Internal.IO.Zip.ProgressiveCrcCalculatingStream.Write(Byte[] buffer, Int32 offset, Int32 count) +177
   MS.Internal.IO.Zip.ZipIOModeEnforcingStream.Write(Byte[] buffer, Int32 offset, Int32 count) +130
   System.Xml.XmlUtf8RawTextWriter.FlushBuffer() +7519035
   System.Xml.XmlUtf8RawTextWriter.RawText(Char* pSrcBegin, Char* pSrcEnd) +232
   System.Xml.XmlUtf8RawTextWriter.WriteStartElement(String prefix, String localName, String ns) +192
   System.Xml.XmlWellFormedWriter.WriteStartElement(String prefix, String localName, String ns) +7517920
   DocumentFormat.OpenXml.OpenXmlElement.WriteTo(XmlWriter xmlWriter) +283
   DocumentFormat.OpenXml.OpenXmlCompositeElement.WriteContentTo(XmlWriter w) +114
   DocumentFormat.OpenXml.OpenXmlElement.WriteTo(XmlWriter xmlWriter) +316
   DocumentFormat.OpenXml.OpenXmlCompositeElement.WriteContentTo(XmlWriter w) +114
   DocumentFormat.OpenXml.OpenXmlPartRootElement.WriteTo(XmlWriter xmlWriter) +404
   DocumentFormat.OpenXml.OpenXmlPartRootElement.SaveToPart(OpenXmlPart openXmlPart) +217
   DocumentFormat.OpenXml.Packaging.OpenXmlPackage.SavePartContents() +203
   DocumentFormat.OpenXml.Packaging.OpenXmlPackage.Dispose(Boolean disposing) +32
   DocumentFormat.OpenXml.Packaging.OpenXmlPackage.Dispose() +24
   Yara.Evento.Utility.Office.Excel.Write.Do(List`1 objects, String sheetName, HeaderList headerNames) +2371
   Yara.Evento.Management.Web.Controllers.TicketController.List(String button, Nullable`1 page, String startDate, String endDate, String ownerMail, String eventName, String mobile, String eMail, String ticketCode, Int32 sort, Boolean desc, Int32 eventId, Int32 status, Int32 variantId) +13628
   lambda_method(Closure , ControllerBase , Object[] ) +864
   System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters) +264
   System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +39
   System.Web.Mvc.<>c__DisplayClass15.<InvokeActionMethodWithFilters>b__12() +124
   System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation) +726390
   System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(ControllerContext controllerContext, IList`1 filters, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +309
   System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) +726324
   System.Web.Mvc.Controller.ExecuteCore() +159
   System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext) +334
   System.Web.Mvc.<>c__DisplayClassb.<BeginProcessRequest>b__5() +62
   System.Web.Mvc.Async.<>c__DisplayClass1.<MakeVoidDelegate>b__0() +15
   System.Web.Mvc.<>c__DisplayClasse.<EndProcessRequest>b__d() +52
   System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +606
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +288

4 个答案:

答案 0 :(得分:8)

似乎将ApplicationPool的Identity更改为LocalSystem并不总是有帮助,这与我在Windows Server 2009 R2中的情况有关。奇怪的是,自从我阅读了这个主题并用大型基于OpenXML的报告解决了我的问题后,它工作了大约半年,但几天前它就停止了工作。

经过一天的研究后,我发现另外在ApplicationPool的高级设置中将加载用户个人资料设置为 True (默认值为False)并且再没有问题。

答案 1 :(得分:2)

我将应用程序池标识更改为更高级别的帐户,并在IIS中具有完全控制权限。

IIS&GT;应用程序池&gt;高级设置&gt;身份(在过程模式下)&gt;选择具有更高访问权限的帐户

答案 2 :(得分:2)

我同意@Behrooz,将ApplicationPool的身份更改为 LocalSystem ,它会起作用。

当项目在我的PC的本地主机上运行时,我没有遇到这个问题,但是当我将它部署到服务器时我做了..

见此截图:

enter image description here

答案 3 :(得分:0)

OpenXML使用IsolatedStorage来存储大文件。有关更多信息,请访问http://www.lyquidity.com/devblog/?p=65

您可以在C:\ Users \ username \ AppData \ Local中找到isolatedStorage文件夹。我们发现,当该文件夹为时,我们没有收到“无法创建Mutex”异常。 重新启动IIS 后,我们也没有得到异常。我们发现这与使用并锁定该文件夹的其他Web应用程序有一定关系,因此是OpenXml的互斥体异常。

经过更多搜索后,我们发现DotNetOpenAuth可能还根据报告的https://github.com/DotNetOpenAuth/DotNetOpenAuth/issues/381使用隔离存储。我们的某些应用程序正在使用它,并且在它们启动时会在IsolatedStorage文件夹中创建文件和文件夹,此后将开始发生Mutex异常。

您可以通过在Web.config中将以下标志更改为false来禁用DotNetOpenAuth报告

<reporting enabled="true"/>

这为我们解决了问题