IIS 7.5上的ASP.Net站点不采用第三方DLL的新版本

我有一个使用SubSonic版本2.1.0的Web应用程序。 在添加一些新function的同时,我遇到了在2.2.0版中修复的版本中的一个错误。

在我的开发盒,我切换的DLL引用的版本,一切工作正常。

更新运行IIS 7.5的Windows 2008 R2服务器后,该错误仍然存​​在。

我search了服务器,并用最新版本replace了SubSonic.dll的每个实例。

重新启动网站,应用程序池,然后重新启动整个服务器。

我运行SysInternal的进程资源pipe理器,并检查该网站的w3wp.exe进程,并根据它,w3wp.exe引用SubSonic.dll 2.2.0版。

我已经将数据库和站点文件从Windows 2008服务器复制到另一个2008(从未有v2.1.0加载),并确认该错误不会发生在那里。

基于这些症状,似乎服务器持有的是2.1.0版本的DLL,但我无法弄清楚它在哪里以及如何摆脱它。


附加信息:

我检查了GAC,没有SubSonic dll。

使用Windows SDK 6.1中的gacutil将2.2.0安装到GAC中

在服务器上设置一个新的站点和应用程序池,并从我的开发箱上传一个新的站点文件副本。

网站是C#。NET 2.0使用MVC 1与nHaml 2.0的视图引擎。


使用cygwin查找search与2.1 DLL大小相同的任何文件的文件系统。

发现了一些Windowssearch框没有的副本,他们只是在一个备份文件夹中,不应该被使用,删除以防万一。

与2.1.0版本大小相同的剩余文件是:
./Windows/System32/DriverStore/FileRepository/prnca00z.inf_amd64_neutral_27f402ce616c3ebc/Amd64/CNBDR4_5.DLL
./Windows/winsxs/amd64_microsoft-windows-getuname.resources_31bf3856ad364e35_6.1.7600.16385_en-us_eca42f29f7e4d0ea/getuname.dll.mui
./Windows/winsxs/amd64_prnca00z.inf_31bf3856ad364e35_6.1.7600.16385_none_ea189c313845a10e/Amd64/CNBDR4_5.DLL
./Windows/winsxs/x86_microsoft-windows-getuname.resources_31bf3856ad364e35_6.1.7600.16385_en-us_908593a63f875fb4/getuname.dll.mui

这似乎与SubSonic DLL无关。


2010年8月30日更新

有关错误怀疑使用DLL版本的推理是问题:

发生的错误是相当具体的,并且在我的开发框中,当我在2.1.0和2.2.0之间更改2.1.0和2.2.0之间的DLL时,它可以预见。

我也把网站放到了不同的服务器上,它运行良好,所以它的工作并不是唯一的,我的开发框。

基本上,在版本2.1.0中,当执行分页结果查询时,WHERE子句元素加倍,所以生成的查询将以“WHERE CreatedOn>'8-1-2010'AND CreatedOn>'8-1-2010'”结尾。

尽pipe冗余,但在句法上这是很好的执行。

当你添加一个SubQuery的时候是因为SubQuery对象的SQL产生了两次而第二次,而不是从一个WHERE开始的,因为如果WHERE已经启动,跟踪对象的布尔标志是从第一次生成SQL开始就是true。

所以在2.1.0下你将得到“WHERE ID IN(SELECT ID FROM表WHERE CreatedOn>'8-1-2010')AND ID IN(SELECT id FROM table AND CreatedOn>'8-1-2010')”

在2.2.0中,页面查询中的WHERE子句不重复其条件,因此SubQuery不会生成不正确的SQL语法。

SQL生成发生在DLL中,我可以通过SQL Profiler观察器,2.1.0生成错误的语法,但是当我使用2.2.0本地运行时,语法是正确的。

因为这个错误是这样一个特定的情况,网站一般工作正常,它只是在一个特定的search查询发生这种情况,很容易重复,没有代码,数据或数据结构或其他环境的变化,它的错误在2.1.0下但不是2.2.0。

我以前没有给出具体的错误,因为它似乎没有解决问题相关,解决scheme应该是关于任何第三方dll加载从一个asp.net网站的bin目录被caching,而不是更新后的版本池,服务和机器重新启动,新站点容器创build,删除和重新上传所有站点文件等。

更新 :尝试删除以下内容:

%SystemRoot%\Microsoft.NET\Framework<64>\<versionNumber>\Temporary ASP.NET Files 

对相关path执行此操作(具体取决于.net和32/64位的版本)。

更新之前 :我不熟悉亚音速。 但也许它会产生程序集或存储过程。 不知何故,这个东西的旧版本即使在升级后仍然保留。 使用进程监视器来检查应用程序从磁盘加载的内容。 并检查存储过程是否相关。

几个问题:

  • 在将其部署到IIS7 / Win2k8服务器之前,您是否重build了该网站? 即,部署参考2.1.0或2.2.0版本的站点?
  • 议会是强名还是弱名? 如果它是强名称,它是否安装到GAC?
  • 错误的存在是您认为问题出在DLL版本的唯一理由吗?

虽然我必须承认,我没有完整地阅读你的问题,但我想猜一下问题可能是什么。 我试图张贴这个评论,但该网站不会允许我,出于某种原因。

问题可能不在Subsonic DLL本身,而是在它引用的另一个DLL中。 Subsonic.dll的版本A可能根本不引用这个其他的DLL,但版本B可能会引用它,因此这就是为什么你得到不同的行为,并且找不到问题。

你需要使用一些很好的debugging工具来一步一步地完成事件的stream程,直到你发现一些看起来不正确的东西。

我也认为这是更适合StackOverflow的问题。 我相信这是一个编程相关的问题,特别是关于程序集引用。

尝试在StackOverflow上发布,你会从不同的angular度看待这个问题,然后你平常的服务器pipe理员。

尝试以下操作:

  1. 将App Pool身份帐户更改为pipe理员。

  2. 检查Windows Server 2008 R2是否不是debugging版本。

  3. 看看这个链接 – IIS7caching的东西相当长的时间,所以你可能想重buildcaching。

http://blogs.iis.net/ksingla/archive/2006/11/16/caching-in-iis7.aspx

  1. 等待30分钟后重build您的解决scheme…等待,刷新几次,尝试和重现错误。 它应该最终清除它的caching。

我发现了这个问题。

当我在各种机器上进行更多的testing时,我终于能够重现错误了。

网站代码+ SubSonic 2.1.0 =错误

网站代码+ SubSonic 2.2.0 + SQL Server 2008 =工作

网站代码+ SubSonic 2.2.0 + SQL Server 2008 SP1 =错误

在2.1.0中发生的错误无论如何,在2.2.0的情况下,这个问题是固定的。 还有一个额外的逻辑错误,如果您使用的是2008 SP1,会发生新的错误,但其症状与我在2.1.0中遇到的原始问题相符。

在注意到SQL数据库版本差异,并确认升级我的开发盒,然后发生错误,我现在已经能够find一些额外的信息,我知道我正在看一个新的问题。

https://stackoverflow.com/questions/1711798/subsonic-2-2-sqlquery-object-generates-very-different-sql-for-where-in-stateme

http://github.com/subsonic/SubSonic-2.0/issues
问题7具体,但2,8和9都显得密切相关,并可能会呈现相同的格式错误的SQL语法。