我有一个MVC4应用程序,它加载一些DLL。基本上,MVC应用程序的体系结构是这样的:应用程序从用户接收一些作业,它从dll调用处理函数,最后将结果通过电子邮件发送给用户。
所有dll都是64位编译的,我在64位上使用IIS 8,在Windows Server 2012R2和VS2013上。当我运行/部署应用程序时,其行为是:
Scenario1
:从VS2013中的Visual Studio 2013运行包含调试/发布模式下的Web服务器(IIS Express)=>工作正常Scenario2
:在发布模式下从部署在本地完整IIS8中的Visual Studio 2013运行=>正常工作Scenario3
:在本地完整IIS8中以发布模式部署并直接从浏览器运行,没有打开VS2013 => IIS与An unhandled win32 exception occurred in w3wp.exe.The Just-ln-Time debugger was launched without necessary security permissions. To debug this process, the Just-ln-Time debugger must be run as an Administrator.
崩溃当我打开调试器时,错误是:A heap has been corrupted
。在事件查看器中,日志是:
Faulting application name: w3wp.exe, version: 8.5.9600.16384, time stamp: 0x5215df96
Faulting module name: ntdll.dll, version: 6.3.9600.18821, time stamp: 0x59ba86db
Exception code: 0xc0000374
我知道异常代码0xc0000374来自Heap corruption
。
我使用DebugDiag和Application Verifier调试了IIS,并激活了Full PageHeap标志。崩溃线程的堆栈的相关部分是:
.NET Call Stack
mscorlib_ni!DomainNeutralILStubClass.IL_STUB_PInvoke(IntPtr)+68
[[InlinedCallFrame] (Microsoft.Win32.Win32Native.LocalFree)] Microsoft.Win32.Win32Native.LocalFree(IntPtr)
mscorlib_ni!System.Runtime.InteropServices.Marshal.FreeHGlobal(IntPtr)+2d
Species_DLL.Class1.Species_MetaModel()+b955
rIAMTestMVC4.Impressions.SpeciesUtil.use_Species_Integrated(Int32)+1efd
Full Call Stack
vrfcore!VerifierStopMessageEx+6f4
vrfcore!VfCoreRedirectedStopMessage+90
verifier!VerifierStopMessage+a0
verifier!AVrfpDphReportCorruptedBlock+2a7
verifier!AVrfpDphCheckNormalHeapBlock+c8
verifier!AVrfpDphNormalHeapFree+27
verifier!AVrfDebugPageHeapFree+af
ntdll!RtlDebugFreeHeap+47
ntdll!RtlpFreeHeap+74c85
ntdll!RtlFreeHeap+368
vrfcore!VfCoreRtlFreeHeap+1e
KERNELBASE!LocalFree+2e
mscorlib_ni!DomainNeutralILStubClass.IL_STUB_PInvoke(IntPtr)+68
[[InlinedCallFrame] (Microsoft.Win32.Win32Native.LocalFree)] Microsoft.Win32.Win32Native.LocalFree(IntPtr)
mscorlib_ni!System.Runtime.InteropServices.Marshal.FreeHGlobal(IntPtr)+2d
Species_DLL.Class1.Species_MetaModel()+b955
rIAMTestMVC4.Impressions.SpeciesUtil.use_Species_Integrated(Int32)+1efd
Scenario2和Scenario3之间有什么区别吗? VS是否有任何堆保护?
我也使用IIS7在Windows7上运行相同的场景,并且在所有三个上都可以正常工作。
我无权访问DLL代码,但正如我所提到的,相同的代码在IIS7 / Windows7和Visual Studio的IIS8上运行完美。
LE:调用堆栈中显示了两个函数:
rIAMTestMVC4.Impressions.SpeciesUtil.use_Species_Integrated
=>此函数来自MVC控制器,它调用一个dllSpecies_DLL.Class1.Species_MetaModel
=>此函数来自dll,由前一个函数调用。如何解决scenario3的问题?这些情景之间有什么区别?
谢谢,
我有类似的问题,但我通过将项目构建更改为x86来解决我的问题,以补偿32位。
你是否以管理员身份运行VS2013?如果是这样,那么这就是阻止VS发生错误的原因,并且仅在IIS中发生。
看起来IIS应用程序池在访问这些DLL时遇到问题,VS2013不会出现此问题。
更新:只需将权限添加到池本身即可访问该文件夹:
IIS AppPool\DefaultAppPool
。 (不要忘记将“DefaultAppPool”更改为您为应用程序池命名的任何内容。)注意:通过here的一些更改复制步骤。
要了解或更改运行应用程序的应用程序池:当您打开IIS管理器并从左侧的树中选择应用程序时,请在右侧的“操作”窗格中的“高级设置”中找到它。
要更改池的标识,您可以在左侧树中的计算机下找到它们。
检查this文章,了解如何指定应用程序池的标识。