【问题标题】:TypeLoadException from same code, different site, on same server?来自相同代码,不同站点,同一服务器上的 TypeLoadException?
【发布时间】:2014-08-05 04:58:27
【问题描述】:

在一个环境中,什么可能导致来自 ASP.NET 网站中的辅助程序集的 TypeLoadException,而在另一个环境中则不会?这是我所拥有的:

  • Company.Web,一个.NET类库;参考 System.Web 4.0
  • Company.Web 包含一些 HttpResponse 扩展方法
  • Company.Web 包含一个引用我的 HttpResponse 扩展的 MediaRequestHandler (: IHttpHandler),以及 HttpContext 和相关类
  • Company.UI,一个 ASP.NET WebForms 应用程序集;参考 System.Web 4.0 和 Company.Web
  • 两个项目中的引用都是<Reference Include="System.Web" />
  • MediaRequestHandler 配置如下图
  • 服务器 ABC,站点 1 和站点 2 在 IIS 中
  • DEV 分支,从我构建此代码的位置到服务器 ABC,站点 1
  • MAIN 分支,我将这段代码全部合并到这里,然后我从这里构建到服务器 ABC,站点 2
  • 这些是 Sitecore 网站。

这适用于站点 1,但是当站点 2 尝试调用我的 MediaRequestHandler 时,我在站点 2 中得到了一个 TypeLoadException。异常中没有太多细节(下)。我在服务器上运行了 fuslogvw 并记录了故障,但什么也没看到;我在记录所有内容的情况下运行它,并在 Company.Web 上看到“成功的部分加载”。后者似乎是正常行为;当然,程序集正在加载,因为其中的所有其他内容都可以正常工作。

上面的项目符号是我想我可能搞砸的地方,但我检查了合并和基本站点配置,我看不出有任何差异。我的下一步是深入研究配置比较,但与此同时,任何人都可以就我的调查重点提供建议吗?

配置:

<system.webServer>
  <handlers>
    <add verb="*" path="sitecore_media.ashx" type="Company.Web.Media.MediaRequestHandler, Company.Web" name="Company.MediaRequestHandler" />
  ...
<system.web>
  <httpHandlers>
    <add verb="*" path="sitecore_media.ashx" type="Company.Web.Media.MediaRequestHandler, Company.Web" />

例外:

Exception information: 
    Exception type: TypeLoadException 
    Exception message: Could not load type 'Company.Web.Media.MediaRequestHandler' from assembly 'Company.Web'.
   at System.RuntimeTypeHandle.GetTypeByName(String name, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly, StackCrawlMarkHandle stackMark, IntPtr pPrivHostBinder, Boolean loadTypeFromPartialName, ObjectHandleOnStack type)
   at System.RuntimeTypeHandle.GetTypeByName(String name, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean loadTypeFromPartialName)
   at System.Type.GetType(String typeName, Boolean throwOnError, Boolean ignoreCase)
   at System.Web.Compilation.BuildManager.GetType(String typeName, Boolean throwOnError, Boolean ignoreCase)
   at System.Web.Configuration.HandlerFactoryCache.GetTypeWithAssert(String type)
   at System.Web.Configuration.HandlerFactoryCache.GetHandlerType(String type)
   at System.Web.Configuration.HandlerFactoryCache..ctor(String type)

【问题讨论】:

标签: asp.net .net iis reflection sitecore


【解决方案1】:

类型加载异常意味着在指定的程序集Company.Web 中找不到请求的类型Company.Web.Media.MediaRequestHandler。因为它只在一种环境中工作,而不是在另一种环境中工作,所以我建议检查以下内容:

  1. Company.Web程序集未更新的问题 服务器/站点。也就是说Company.Web.dll的问题 服务器/站点不代表您的最新/目标构建包含 Company.Web.Media.MediaRequestHandler

  2. 您的配置中有错误,它引用了错误的类型。换句话说,Company.Web.Media.MediaRequestHandler 实际上不是正确的类型名称。

  3. 拼写错误。与上面的 #2 类似,类型的名称在您的配置参考或程序集本身中拼写错误。

根据我的经验,10 次中有 9 次是罪魁祸首。

【讨论】:

  • 接受一般好的建议 - 谢谢。情况并非如此。 dll 已更新,但与其他站点上的二进制文件不同。再说一次,我不确定它是否应该是,因为它是从一个单独的分支构建的。我们有一个以前非常可靠的自动化构建过程,当天的构建确实成功完成。代码文件、项目文件和配置更改都正确合并,并且配置在站点根目录中得到更新。我从来没有找到真正的问题,但下一个版本修复了它。
  • 你给了我信心! SVGChartSGVChart :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-09
  • 1970-01-01
  • 1970-01-01
  • 2022-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多