この問題の長さについてお詫び申し上げますが、皆さんはそれが価値があると思うと思います。私が始める前に、私はで、実際にはで、独立したコンソールアプリケーションを制作しようとしましたが、悲しいことにそれは不可能であることが証明されました。このバグはコンソールアプリケーションでは発生しません。これは、内蔵のASP.NETアプリケーションでは発生しません。 Windows 7上でIIS 7.5内で実行された場合にのみ発生します。__TransparentProxy
(WCF経由)とdynamic
(int)の組み合わせが含まれるため、エラーは動的言語ランタイムに関連しているようです。問題を引き起こす行は、プロキシと動的intの両方を渡す静的メソッド(メソッド本体を含まない)が呼び出されることです。IIS 7.5と組み合わせた動的言語ランタイムのバグ
このメソッドが呼び出されると、w3wp.exeプロセスはCPU全体を占有し、メモリを非常に高速に増加させます(私にとっては、毎秒100メガ程度ですが、おそらくGCのためにテーパーが消えます)。
このエラーを再現するには、Visual Studio( "新規" | "プロジェクト" "C#" | "Web" | "ASP.NET Webアプリケーション")で新しいASP.NET Webサイトを作成します。その後、新しいプロジェクトをホームディレクトリとするIISで新しいサイトを作成します。 (また、 "Everyone"にそのフォルダへの完全な読み取り/書き込みアクセス権を与え、アプリケーションプールが.NET 4.0を使用していることを確認してください)新しいサイトに7080などの特定のポートを与えます。最後に、このコードをGlobal.asax.csに貼り付けます:
public class Global : System.Web.HttpApplication
{
void Application_Start(object sender, EventArgs e)
{
dynamic dynamicId = 5;
var serviceUrl = "http://localhost:7182/FooServices.svc";
ChannelFactory factory = new ChannelFactory<IFooServices>(new WSHttpBinding(), new EndpointAddress(serviceUrl));
factory.Open();
IFooServices fooServices = ((ChannelFactory<IFooServices>)factory).CreateChannel();
BlowUpTheProgram(fooServices, dynamicId); // This line hangs
}
[ServiceContract]
public interface IFooServices
{
[OperationContract]
void Bar();
}
public static void BlowUpTheProgram(IFooServices eventServices, int authorMailboxId)
{
}
}
http://localhost:7080
(またはあなたが選択したポート)からブラウザにアクセスしてください。報告された症状を確認した後、w3wp.exeプロセスを強制終了したいので、タスクマネージャを準備しておいてください。
、プロキシと動的にはこのバグを表面に一緒に働いていることを確認し、この行を変更するには、次へ
dynamic dynamicId = 5;
を:
int dynamicId = 5;
再試行し、問題がなくなったわかります離れてページが読み込まれます。今dynamic
に戻ってそれを変更してから、この行を変更:
IFooServices fooServices = ((ChannelFactory<IFooServices>)factory).CreateChannel();
へ:
IFooServices fooServices = null;
再試行を、あなたは再び問題があまりにもこのシナリオでなくなって気づくでしょう。
最後に、デバッガを接続してすべてをブレークすると、このメソッド呼び出しでスタックしている間に何をしているのかがわかります。それは、常にのようなものを示しているようだ:!
がmscorlib.dll System.RuntimeMethodHandle.GetDeclaringType(System.IRuntimeMethodInfo法)+ 0x2fバイト
がmscorlib.dll System.Reflection.Emit.DynamicResolver.ParentToken(int型トークン! )+ 0x1f3バイト
[マネージド移行にネイティブ]
のMscorlib.dll!System.Reflection.Emit.DynamicMethod.CreateDelegate(のSystem.Type delegateType、オブジェクトターゲット)+ 0x29バイト
システム[ネイティブへの遷移管理] .Core.dll!System.Linq.Expressions.Expression> .Compile()+ 0xbbバイト
System.Core.dll!System.Runtime.CompilerServices.CallSiteBinder.BindCore>(System.Runtime.CompilerServices。(System.Runtime.CompilerServices.CallSite site = {System.Runtime.CompilerServices.CallSite>}、WebApplication1)。グローバルarg0 = {ASP.global_asax}、WebApplication1.Global.IFooServices arg1 = {System.Runtime.Remoting.Proxy.__ TransparentProxy}、オブジェクトarg2 = 5)+ 0x3f0バイト
WebApplication1.dll!WebApplication1.Global.Application_Start(オブジェクト送信者= {System.Web.HttpApplicationFactory}、System.EventArgs E = {System.EventArgs})ライン19 + 0x1b8バイトレコードのC#
は、私は、3台の異なるマシン上でそれを試してREPROすることができたましたWindows7/IIS7.5のボックスにのみ表示されます。 Windows Server 2008/IIS7ボックスに問題はありませんでした。
質問は、この問題をどのように解決してメソッドを呼び出すのですか?また、なぜこれは起こっているのですか?私は、IISがクラッシュするため、DLRを使用するものを呼び出すことに過度に注意する必要はありません。
あなたの質問は何ですかカーク? –
質問は、「どうやってこのメソッドを呼び出すのですか? –
ダイナミックを使用する必要がありますか?私はちょうど問題を解決するかどうか、それを壊す理由を探しているかどうか疑問に思っていますか?動的な使用を決定づける要因は何ですか? –