SubSonicバージョン2.1.0を使用していたWebアプリケーションがあります。いくつかの新機能を追加しているときに、2.2.0で修正されたそのバージョンのバグに遭遇しました。
開発ボックスで、参照されているDLLのバージョンを切り替えると、すべてが正常に機能しました。
IIS 7.5を実行しているWindows2008 R2サーバーを更新した後、バグは解決していません。
サーバーを検索し、SubSonic.dllのすべてのインスタンスを最新バージョンに置き換えました。
サイト、アプリプール、そしてサーバー全体を再起動しました。
SysInternalのProcessExplorerを実行し、サイトのw3wp.exeプロセスを確認したところ、w3wp.exeはSubSonic.dllのバージョン2.2.0を参照しています。
そのWindows2008サーバーから別の2008(v2.1.0がロードされたことがないサーバー)にデータベースとサイトファイルをコピーし、そこでバグが発生しないことを確認しました。
症状からすると、サーバーは2.1.0バージョンのDLLを保持しているようですが、どこにあるのか、どのように取り除くのかわかりません。
追加情報:
私はGACをチェックしましたが、SubSonicdllはチェックしませんでした。
Windows SDK6.1のgacutilを使用してGACに2.2.0をインストールしました
サーバーに新しいサイトとAppPoolをセットアップし、開発ボックスからサイトファイルの新しいコピーをアップロードしました。
サイトはC#.Net 2.0で、ビューエンジンにMVC1とnHaml2.0を使用しています。
Cygwin findを使用して、2.1DLLと同じサイズのファイルをファイルシステムで検索しました。
Windowsの検索ボックスにはないコピーがいくつか見つかりました。それらはバックアップフォルダにあり、使用されるべきではなく、万が一に備えて削除されました。
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
これはSubSonicDLLとは何の関係もないようです。
2010年8月30日更新
使用中のDLLバージョンを疑うためのバグに関する理由は問題です:
発生しているエラーはかなり具体的であり、開発ボックスでDLLの2.1.0と2.2.0の間で変更すると、2.2.0ではなく2.1.0で発生すると予想されます。
また、サイトを別のサーバーに配置しましたが、2.2.0で正常に動作するため、開発ボックスに固有の動作ではありません。
基本的に、バージョン2.1.0では、ページ結果クエリを実行すると、WHERE句の要素が2倍になるため、生成されるクエリは「WHERE CreatedOn> '8-1-2010' AND CreatedOn> '8-1-2010'」になります。 。
冗長ですが、構文的にはこれを実行しても問題ありません。
SubQueryを追加すると、問題が発生します。これは、SubQueryオブジェクトのSQLがWHEREで開始するのではなく、2回目と2回目に生成されるためです。これは、WHEREが開始されているかどうかを追跡するオブジェクトのブールフラグがSQLを最初に生成したときから開始時にtrue。
したがって、2.1.0では、「WHERE id IN(SELECT id FROM table 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プロファイラーを介して2.1.0が不正な構文を生成することを確認できますが、2.2.0でローカルに実行すると構文は適切です。
このエラーはそのような特定の状況であるため、サイトは一般的に正常に機能します。これが発生するのは特定の検索クエリのみであり、コード、データ、データ構造、またはその他の環境の変更なしで、エラーが発生するのは非常に簡単です。 2.1.0未満ですが、2.2.0ではありません。
問題の解決に関連していないように思われるため、以前はバグの詳細を説明していませんでした。解決策は、キャッシュされているasp.netサイトのbinディレクトリからロードされたサードパーティのdllに関するものであり、アプリの後にバージョンを更新しないことです。プール、サービスとマシンの再起動、新しいサイトコンテナの作成、すべてのサイトファイルの削除と再アップロードなど。
問題を見つけました。
さまざまなマシンでさらにテストを行っていたので、ようやくエラーを再現することができました。
サイトコード+ 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データベースのバージョンの違いに気づき、開発ボックスをアップグレードしてエラーが発生したことを確認した後、新しい問題を探していることがわかったので、いくつかの追加情報を見つけることができました。
http://github.com/subsonic/SubSonic-2.0/issues
特に問題7ですが、2、8、および9はすべて密接に関連しているようであり、おそらく同じ不正な形式のSQL構文で表示されます。
私はあなたの問題を完全に読んでいないことを認めなければなりませんが、私は問題が何であるかを推測したいと思います。コメントとして投稿しようとしたのですが、どういうわけかサイトで許可されませんでした。
問題は、亜音速DLL自体ではなく、それが参照する別のDLLにある可能性があります。 Subsonic.dllのバージョンAは、この他のDLLをまったく参照しない可能性がありますが、バージョンBはそれを参照する可能性があるため、異なる動作が発生し、問題を特定できません。
見栄えの悪いものが見つかるまで、イベントのフローを1つずつステップ実行するために、いくつかの優れたデバッグツールを使用する必要があります。
また、これはStackOverflowに適した質問だと思います。これはプログラミング関連の問題であり、特にアセンブリの参照に関してはそうです。
StackOverflowにも投稿してみてください。この問題を、通常のサーバー管理者とは異なる角度から見ることができます。
更新:次のコンテンツを削除してみてください:
%SystemRoot%\Microsoft.NET\Framework<64>\<versionNumber>\Temporary ASP.NET Files
関連するパスに対してこれを実行します(.netのバージョンと32/64ビットによって異なります)。
更新前:亜音速に慣れていません。ただし、アセンブリまたはストアドプロシージャが生成される可能性があります。そして、どういうわけか、このことの古いバージョンは、dllのアップグレード後も保持されています。 プロセスモニター を使用して、アプリケーションがディスクから何をロードしているかを確認します。また、関連する場合は、ストアドプロシージャも確認してください。
いくつかの質問:
次のことを試してください。
アプリプールIDアカウントを管理者に変更します。
Windows Server 2008R2がデバッグバージョンではないかどうかを確認します。
このリンクをチェックしてください-IIS7はかなり長い間キャッシュするので、キャッシュを再構築することをお勧めします。
http://blogs.iis.net/ksingla/archive/2006/11/16/caching-in-iis7.aspx