使用IIS8堆积MVC应用程序中的损坏

问题描述 投票:3回答:2

我有一个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控制器,它调用一个dll
  • Species_DLL.Class1.Species_MetaModel =>此函数来自dll,由前一个函数调用。

如何解决scenario3的问题?这些情景之间有什么区别?

谢谢,

asp.net-mvc-4 iis visual-studio-2013 iis-7 iis-8
2个回答
0
投票

我有类似的问题,但我通过将项目构建更改为x86来解决我的问题,以补偿32位。


0
投票

你是否以管理员身份运行VS2013?如果是这样,那么这就是阻止VS发生错误的原因,并且仅在IIS中发生。

看起来IIS应用程序池在访问这些DLL时遇到问题,VS2013不会出现此问题。

更新:只需将权限添加到池本身即可访问该文件夹:

  1. 选择包含DLL的文件夹右键单击并选择“属性”
  2. 选择“安全”选项卡单击“编辑”,然后单击“添加”按钮
  3. 单击“位置”按钮,确保选择本地计算机。 (如果服务器属于一个域,则不是Windows域。)
  4. 在“输入要选择的对象名称:”文本框中输入IIS AppPool\DefaultAppPool。 (不要忘记将“DefaultAppPool”更改为您为应用程序池命名的任何内容。)

注意:通过here的一些更改复制步骤。


要了解或更改运行应用程序的应用程序池:当您打开IIS管理器并从左侧的树中选择应用程序时,请在右侧的“操作”窗格中的“高级设置”中找到它。

要更改池的标识,您可以在左侧树中的计算机下找到它们。

检查this文章,了解如何指定应用程序池的标识。

© www.soinside.com 2019 - 2024. All rights reserved.