本番環境の SqlSiteMapProvider の問題 - すべてのアイテムが「消えた」?
-
20-09-2019 - |
質問
サイトマップを使用する ASP.NET アプリケーションがいくつかあります。サイトマップは、次の場所にある SqlSiteMapProvider サンプルの VB.NET 実装を介して設定されます。 邪悪なコード. 。これは DLL にコンパイルされ、インストールされ、サーバー上の GAC およびローカルからも参照されます。ここ数か月間、本番環境では問題なく動作しています。SQL Server 2008 を使用していることにも注意してください。
今日、私たちは本番環境に来て、どのアプリケーションの本番環境のサイトマップにもメニュー項目がまったく表示されていないことに気づきました。開発と QA は問題ないようでした。SQLSiteMapProvider を実装するずっと前から、かなり長い間、本番環境で SQL Server のメンテナンスを行っていませんでした。また、最近は Web アプリも更新していません。
私が最初にやったことは、prod web.config を取得し、それを IDE の web.config に設定し、アプリを実行することでした。それでも同じ問題が発生しました。私のマシンでもバグが再現されているため、これで IIS の問題は除外されるはずです。
これは少し緊急だったので、次に私が行ったことは、本番環境のサイトマップ テーブルにダミー レコードを挿入して、何が起こるかを確認することでした。なんと、魔法のようにメニュー項目が復元され、すべてがうまくいきました。ダミーのメニュー項目を削除したところ、問題なく同期されました。
ただ、これは少し怖かったので、今後同じことが起こらないように、なぜこのようなことが起こったのかを解明しようとしています。これを経験した人はいますか?SqlSiteMapProvider を使用したことがない場合、SqlDependencyCache/ASP.NET キャッシュを使用してメニュー項目を保存するだけです。リンクを返すストアド プロシージャの結果セットが変更されると、ASP.NET にこれが発生したことを通知し、サイトマップ/キャッシュ...
おそらく、Web サーバーと SQL Server の間の接続が何らかの理由で切断されたのでしょうか?そして、レコードを挿入すると「ウェイクアップ」して再び接続できるようになったのでしょうか?おそらく、接続が正常であることを確認するために、PageLoad でチェックする必要があるタイムアウト値またはある種の IsStillConnected() 関数がどこかにあるのでしょうか?それとも、テーブルにレコードを挿入するまで、ASP.NET はストアド プロシージャが何らかの理由で値を返さないと考えていたのでしょうか?この問題を以前に見た人はいますか?
ご指導をよろしくお願いいたします。
編集:これはすべて、ストアドプロシージャに SET NOCOUNT ON を設定したことに起因します。注意してください!これは MSDN ドキュメントのどこにも記載されておらず、しばらくの間本当に混乱しました。
解決 2
私の編集を確認してください。)
このすべては私のストアドプロシージャでSET NOCOUNT ONを持っていることから来ました。注意してください!これは、MSDNのドキュメントではなく、どこでも、本当にしばらくの間、私をねじ込み!
他のヒント
SqlDependency は、正確には安定性の原動力ではありません。おそらくいくつかの光を当てることができるいくつかの記事を次に示します。