非常に有線のエラーがあります。カスタムコントロールの1つは、2つのコンパイル済みファイルを作成しているようです。動的にロードしようとすると、LoadControl()
まったく同じであっても、一方を他方にキャストできないため、失敗します。私はすべてが同じであることを確認するためにメッセージを書きます、コンパイルされたdllを変更するだけです。
System.Web.HttpUnhandledException (0x80004005):
Exception of type 'System.Web.HttpUnhandledException' was thrown. --->
System.InvalidCastException:
[A]ASP.Modules_OneProduct_MedioumImage cannot be cast to
[B]ASP.Modules_OneProduct_MedioumImage.
Type A originates from 'App_Web_kg4bazz1, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'
in the context 'Default'
at location 'C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\root\80ed7513\10eb08d9\App_Web_kg4bazz1.dll'.
Type B originates from 'App_Web_oneproduct_mediumimage.ascx.d1003923.4xoxco7b, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'
in the context 'Default'
at location 'C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\root\80ed7513\10eb08d9\App_Web_oneproduct_mediumimage.ascx.d1003923.4xoxco7b.dll'.
コード
これは、 MSDNに書かれている内容を正確に実行した後の、現在のコードです。
foreach (int OneProductID in TheProductIdArrays)
{
// here is the throw.
ASP.Modules_OneProduct_MedioumImage OneProduct =
(ASP.Modules_OneProduct_MedioumImage)LoadControl(@"~/mod/OneProduct_MediumImage.ascx");
// do some work with
//OneProduct
}
以前は、コントロールをロードせずにロードしましたASP.
が、このバグが表示されて解決策を探した後、MSDNの内容に厳密に従います。私が何をしても、バグはまだここにあります。
私はまた、この方法の両方を、それぞれを単独で、そして一緒に(再び失敗して)試しました
<%@ Register src="~/mod/OneProduct_MediumImage.ascx" tagname="OneProduct_MediumImage" tagprefix="uc1" %>
<%@ Reference Control="~/mod/OneProduct_MediumImage.ascx" %>
構成
私のweb.configは、20、100、1000で試しましたが、trueまたはfalsemaxBatchSize
でも試しましoptimizeCompilations
たが、バグが再び発生します。
<compilation debug="false" defaultLanguage="C#" batch="true"
maxBatchSize="800" batchTimeout="10800" optimizeCompilations="false"
targetFramework="4.0">
今についてのいくつかの詳細
- エラーはランダムであり、コンパイルが表示される場合と表示されない場合があります。
- このプロジェクトは大きなもので、ページは毎分たくさんの人が何かを見ようと頼んでいるだけでなく、中に誰もいないときにも表示されます。
- 64ビットdot.net4、統合で実行されます
- Webガーデンとして実行しますが、テスト済みで1つのプールのみ(同じ問題が発生します)
- プロジェクト全体でセッションがオフになっています。
- ページは2007年から掲載されていますが、この問題は先月発生しました。残念ながら、どこでどのように開始されたのか、何が原因で発生したのかがわかりません。
- カスタムコントロールロードが1つだけ表示され、呼び出しが多いものが表示されます。
- コードを4倍変更して、小さな変更または大きな変更を加えましたが、まだそこにあります。
- 私は
optimizeCompilations
真と偽、そして同じ問題で試してみました。 - また、Webを停止し、すべての一時ファイルを削除し、再度開いてみましたが、再び実行されました。
- アプリケーションが一度に1つのコンパイルのみをロックし始めたときに、global.asaxにミューテックスを配置しようとしましたが、これも失敗します。
- 動作した瞬間から、すべてが良好ですが、動作しない場合は自動修正されません。
- このカスタムコントロールをロードするコードは存在し、コードの複数の場所、異なるページで呼び出されます。
- 同様の負荷を持つ他のカスタムコントロールには問題はありませんでした。
- このカスタムコントロールでは、ViewStateは無効になっています。
- また、いくつかのコードを再配置し、マイクロオプティマイズで完全な関数呼び出しを変更してみましたが、失敗することはありません。
開発用コンピュータで問題なく動作します。web.configに配置batch="true"
すると、バグがすぐに表示されます。- どうしても直せないバグなど、他にそのような問題はありません。システムは数日間稼働し、プールはまったくリサイクルされておらず、メモリは安定しており、より多くの空き容量があります。プログラムは何年も実行されていますが、私たちはほぼ毎日更新されて変更されます。
- 同じコアコードの下で複数のサイト(stackexchangeのようなもの)が実行され、すべてが同じランダムな問題を抱えています。
- AutoEventWireupがfalse
- それが表示され、同じ方法でロードする他のカスタムコントロールに表示されます。
このバグが発生した場合の回避策として、現在行っていること:小さな変更を加えてプロジェクトを強制的に再コンパイルすると、次の更新までエラーがなくなります。
理由を見つけることなく、過去数週間のツリーを解決しようとするバグがあります。できることはほとんど何でも試しましたが、すべて失敗し、バグが再び発生します。だから私はここに投稿するかもしれませんが、私を助けてこれから抜け出す方法を見つけることができるかもしれません。
最後の言葉:このバグはおかしいです、カスタムコントロールは同じです、私はそれに対して何でもします私はそれを動的にロードしてブームします、コンパイラは彼だけが知っている何らかの理由でそれを2つの異なる時間に持っています-ランダムに。
アップデート1
開発者のマシンでバグを再現することができました。そこで、このカスタムコントロールを含む2つのdllモジュールが異なることに気付きました。
1つは、4つのカスタムコントロールをまとめたものです。もう1つのモジュールは、カスタムコントロールのみでした。
回避策
ツリー週間でこのバグを修正しようとした後、コンパイラがディレクトリのバッチコンパイルを行い、同じdllに多くの異なるカスタムコントロールをバンドルすると、このバグが発生することになります。したがって、単独でロードしようとすると、この例外がスローされます。
そのため、問題のあるカスタムコントロールを別のディレクトリだけに移動し、今のところ回避しているようです。
アップデート2
一部のファイルを別のディレクトリに移動した後でも、再び表示されます。ランダムであり、そのトリガーとなるものとの明確な関係を見つけることができません。
アップデート3
ここでの主な問題はbatch="true"
、同じdllで多くのカスタムコントロールをコンパイルするバッチコンパイル()であることがわかっているため、コンパイラにそれを行わないように指示する1つの方法はmaxBatchGeneratedFileSize
パラメータです。100の値で使用しましたが、問題が再び発生しました。今度は40に下げてテストします。
maxBatchGeneratedFileSize="40"