繁体   English   中英

将ASP.NET 4 Web应用程序部署到IIS6服务器后,工作进程回收导致其大部分时间停止工作

[英]After Deploying ASP.NET 4 web application to IIS6 server, worker process recycles cause it to stop working most of the time

这是一个非常奇怪的情况,所以希望我能很好地解释一下。

我正在将ASP.NET 4 Web窗体应用程序部署到运行IIS6的Windows Server 2003 SP2服务器。

这就是问题所在-当应用程序池大约80%的时间回收其工作进程(w3wp.exe)时,每次尝试查看时,当我尝试访问应用程序中包含EntityDataSoure的任何页面时,都会收到ReflectionTypeLoadException错误它。

但是(这是有趣的部分)-其他20%的效果很好。 实际上,我实际上是关闭了完全为该应用程序池回收工作进程的过程,只是从web.config中添加/删除空格,迫使站点重新编译,直到获得“好” w3wp.exe。

如果不清楚,我要说的是:对于包含EntityDataSource的页面,实际的工作进程根本不起作用,大约是启动时的4/5倍,但是仍然可以很好地为所有其他页面提供服务。 一旦获得了一个工作流程,该工作流程设法使用EntityDataSource为页面提供服务,则该工作流程会一直工作,直到该流程被回收为止。

我的问题是,我该如何调试? 它的工作原理我的开发机器上很好,能正常工作的服务器上,只要你得到一个良好的工艺运行,但IISRESET或杀死的工作进程几乎肯定会导致站点不回来了重新启动服务器或任何东西,抛出此ReflectionTypeLoadException。

这是我的web.config的编译部分:

<compilation debug="false" targetFramework="4.0">
  <assemblies>
    <add assembly="System.Data.Entity, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
    <add assembly="System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A" />
    <add assembly="System.Web.Extensions.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    <add assembly="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" />
  </assemblies>
</compilation>

这是有关此异常的所有信息:

Application information: 
    Application domain: /LM/W3SVC/1/Root/name-5-129230865053805490 
    Trust level: Full 

Process information: 
    Process ID: 3300 
    Process name: w3wp.exe 
    Account name: NT AUTHORITY\NETWORK SERVICE 

Exception information: 
    Exception type: ReflectionTypeLoadException 
    Exception message: Unable to load one or more of the requested types. Retrieve the LoaderExceptions property for more information.

Thread information: 
    Thread ID: 6 
    Thread account name: NT AUTHORITY\NETWORK SERVICE 
    Is impersonating: False 
    Stack trace:    at System.Reflection.RuntimeModule.GetTypes(RuntimeModule module)
   at System.Reflection.Assembly.GetTypes()
   at System.Data.Metadata.Edm.ObjectItemConventionAssemblyLoader.LoadTypesFromAssembly()
   at System.Data.Metadata.Edm.ObjectItemAssemblyLoader.Load()
   at System.Data.Metadata.Edm.AssemblyCache.LoadAssembly(Assembly assembly, Boolean loadReferencedAssemblies, ObjectItemLoadingSessionData loadingData)
   at System.Data.Metadata.Edm.AssemblyCache.LoadAssembly(Assembly assembly, Boolean loadReferencedAssemblies, KnownAssembliesSet knownAssemblies, EdmItemCollection edmItemCollection, Action`1 logLoadMessage, Object& loaderCookie, Dictionary`2& typesInLoading, List`1& errors)
   at System.Data.Metadata.Edm.ObjectItemCollection.LoadAssemblyFromCache(ObjectItemCollection objectItemCollection, Assembly assembly, Boolean loadReferencedAssemblies, EdmItemCollection edmItemCollection, Action`1 logLoadMessage)
   at System.Data.Metadata.Edm.ObjectItemCollection.ExplicitLoadFromAssembly(Assembly assembly, EdmItemCollection edmItemCollection, Action`1 logLoadMessage)
   at System.Data.Metadata.Edm.MetadataWorkspace.ExplicitLoadFromAssembly(Assembly assembly, ObjectItemCollection collection, Action`1 logLoadMessage)
   at System.Web.UI.WebControls.EntityDataSourceView.ConstructContext()
   at System.Web.UI.WebControls.EntityDataSourceView.ExecuteSelect(DataSourceSelectArguments arguments)
   at System.Web.UI.WebControls.ListControl.OnDataBinding(EventArgs e)
   at System.Web.UI.WebControls.ListControl.PerformSelect()
   at System.Web.UI.WebControls.BaseDataBoundControl.EnsureDataBound()
   at System.Web.UI.WebControls.ListControl.OnPreRender(EventArgs e)
   at System.Web.UI.Control.PreRenderRecursiveInternal()
   at System.Web.UI.Control.PreRenderRecursiveInternal()
   at System.Web.UI.Control.PreRenderRecursiveInternal()
   at System.Web.UI.Control.PreRenderRecursiveInternal()
   at System.Web.UI.Control.PreRenderRecursiveInternal()
   at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)

没有对项目中的任何文件进行任何更改,因此我无法弄清楚为什么有时候我得到一个“好” w3wp.exe,而有时我得到一个“坏” w3wp.exe。

检查您是否没有针对在同一应用程序池中运行的较低版本(<4.0)构建的另一个ASP.NET站点。 与ASP.NET 1.1和2.0一样,ASP.NET 4.0不能与其他版本共存于同一工作进程中。

更新

我没有发现报告此异常的那一部分,因为它不可见:

Exception message: Unable to load one or more of the requested types.
Retrieve the LoaderExceptions property for more information.

^ ^ ^ look up, the framework is helping us for a change ^ ^ ^

您可以在代码中用try / catch块包装一下,然后丢弃发现的异常吗?

类似于以下代码的代码:

try
{
  //Do your entity data thing in the page...
}
catch(ReflectionTypeLoadException rtle)
{
  foreach(Exception ex in rtle.LoaderExceptions)
  {
    Debug.WriteLine(ex.ToString());
  }
}

LoaderExceptions是成员ReflectionTypeLoadException被抛出异常,并且包含了异常的阵列由类加载器被抛出。

这可以帮助您缩小范围,如果没有,则在其中找到您发现的异常列表。

这是此可怕错误的更新-我正在部署reportviewer控件,并使用copy local = true引用了我项目中所需的几个dll。 看来您必须在服务器上安装ReportViewer redist或得到类似此问题的有趣行为,这显然与EntityDataSource无关。

简而言之,我通过在服务器上安装ReportViewer 10 Redist来解决此问题,而不仅仅是将dll复制到bin中。

http://www.microsoft.com/downloads/details.aspx?FamilyID=a941c6b2-64dd-4d03-9ca7-4017a0d164fd&displaylang=en

我们有一个类似的问题,并通过确保其被项目给予了错误引用的DLL文件的相同版本引用的所有项目,解决它。 即项目A被引发此错误,并投射甲参考DLL版本2.项目A还引用的项目B,其本身参考DLL版本1的dll版本2正在由版本1从项目B.一旦覆盖作为基准在项目b中进行了更改,项目a正常进行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM