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

时间:2010-07-08 18:40:20

标签: c# asp.net windows entity-framework iis

这是一个非常奇怪的情况,所以希望我能够解释得很清楚。

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

这就是问题 - 当应用程序池回收其工作进程(w3wp.exe)时,大约80%的时间,每次我尝试访问包含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。

3 个答案:

答案 0 :(得分:1)

检查您是否没有针对在同一应用程序池中运行的较低版本(<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异常的成员,包含类加载器抛出的异常数组。

这可以帮助您缩小范围,如果没有,则发布您在那里找到的例外列表。

答案 1 :(得分:0)

这是一个关于这个可怕错误的更新 - 我正在部署一个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

答案 2 :(得分:0)

我们遇到了一个类似的问题并通过确保项目引用的所有项目都提供错误来解决它并引用了相同版本的dll。即项目A抛出此错误,项目A引用dll版本2.项目A也引用了项目B,它本身引用了dll版本1.dll的版本2被项目B的版本1覆盖。在项目b中被改变了,项目就像它应该的那样工作。