Asp.net mvc 在MIME类型检查期间,应用程序池与URLMoniker urlmon.dll崩溃
我的应用程序是部署在Windows Server 2012 R2上的ASP.NET MVC网站。我正在使用内置的Windows库urlmonike-urlmon.dll获取文件的MIME类型。我正在将其文件路径传递给GetMimeType方法。我面临的问题是,当我使用VisualStudio调试它时,它返回该文件的mime类型(在我的测试案例中,对于txt文件,它返回“application/octet stream”)。但在生产服务器上部署之后,应用程序池意外崩溃,并且日志文件中没有日志,我花了3天时间才开始处理此代码块(借助其他日志条目) 即使事件查看器也没有显示应用程序池崩溃的任何原因,除了以下原因:为应用程序池“SampleApp”提供服务的进程与Windows process Activation Service发生了致命的通信错误。进程id为“yyyy” 在做了尽可能多的详细研究后,我有以下文章可以提供一些解决方案,但我仍然无法找到这个问题的确切原因Asp.net mvc 在MIME类型检查期间,应用程序池与URLMoniker urlmon.dll崩溃,asp.net-mvc,mime,unmanaged,application-pool,urlmon,Asp.net Mvc,Mime,Unmanaged,Application Pool,Urlmon,我的应用程序是部署在Windows Server 2012 R2上的ASP.NET MVC网站。我正在使用内置的Windows库urlmonike-urlmon.dll获取文件的MIME类型。我正在将其文件路径传递给GetMimeType方法。我面临的问题是,当我使用VisualStudio调试它时,它返回该文件的mime类型(在我的测试案例中,对于txt文件,它返回“application/octet stream”)。但在生产服务器上部署之后,应用程序池意外崩溃,并且日志文件中没有日志,我花
您的问题是“FindMimeFromData”方法的声明! 它在某些地方工作正常,并在其他地方导致iis进程崩溃。看看: 您需要将“FindMimeFromData”的声明更改为: 您还应该对调用此函数进行一些更改。例如:
IntPtr mimeTypePtr;
FindMimeFromData(IntPtr.Zero, null,file, 256, null, 0,out mimeTypePtr, 0);
var mime = Marshal.PtrToStringUni(mimeTypePtr);
嗨,谢谢。。你说得对。您的建议很有用,但根本原因是64位构建。FindMimeFromData仅在32位中工作。稍后我将详细介绍它抛出的错误类型。现在,我已经将逻辑移到了一个32位的exe实用程序,该实用程序在Process类的帮助下从我的web应用程序调用。我就是这样解决的。谢谢你的帮助。
[DllImport("urlmon.dll", CharSet = CharSet.Unicode, ExactSpelling = true, SetLastError = false)]static extern int FindMimeFromData(IntPtr pBC,
[MarshalAs(UnmanagedType.LPWStr)] string pwzUrl,
[MarshalAs(UnmanagedType.LPArray, ArraySubType=UnmanagedType.I1, SizeParamIndex=3)]
byte[] pBuffer,
int cbSize,
[MarshalAs(UnmanagedType.LPWStr)] string pwzMimeProposed,
int dwMimeFlags,
out IntPtr ppwzMimeOut,
int dwReserved);
IntPtr mimeTypePtr;
FindMimeFromData(IntPtr.Zero, null,file, 256, null, 0,out mimeTypePtr, 0);
var mime = Marshal.PtrToStringUni(mimeTypePtr);