既存のASP.Net FrameworkプロジェクトをASP.NETコアプロジェクトに変換し始めました。コンポーネントの1つは、ChannelFactoryを使用するWCF Wrapperでした。私はそれをASP.NET Coreプロジェクトで多くの問題を起こさずに実行できるように変換することができました。しかし、新しいASP.NETコアプロジェクトをテストしている間に、私は接続が増えていることに気付きました。上記のコードは5回呼び出されASP.NET Core ChannelFactory接続を開いたままにする
BasicHttpBinding myBinding = new BasicHttpBinding();
EndpointAddress myEndpoint = new EndpointAddress("http://localhost:63566/Service1.svc");
using (ChannelFactory<IService1> myChannelFactory = new ChannelFactory<IService1>(myBinding, myEndpoint))
{
IService1 instance = myChannelFactory.CreateChannel();
Console.WriteLine(instance.GetData(x));
}
:問題を調査するために、私は非常に基本的なセットアップのChannelFactoryを持つ2つのコンソールプロジェクト(1 ASP.NET Frameworkと他のASP.NETコア)を作成しました。各サービスコールの出力は、プロセスのNETSTAT出力とともにコンソールに送信されます。
ASP.NETフレームワークの出力は:ASP.NETコアの出力は
た:あなたが見ることができるようには、接続は開いたままASP.NET Coreバージョン用。両方のプロジェクトのコードは同一でした。私の知る限り、ASP.NET FrameworkはSystem.ServiceModel 4.0.0.0を使用し、ASP.NET CoreはSystem.ServiceModel.Primitives 4.1.1.0を使用しています。これはバグか、意図された機能ですか、私は何かばかげていますか?私はそれがバグだと非常に驚くだろうが、我々は非常に高いスループットを持っており、接続が開いたままであれば、生産上の問題を引き起こす可能性がある。
UPDATE
私はチャネルを閉じてのChannelFactoryとチャンネルのクローズイベントにコンソールへのロギングを追加するために余分なコードを追加しました。コードは次のとおりです:
public void CallIt(int x)
{
BasicHttpBinding myBinding = new BasicHttpBinding();
EndpointAddress myEndpoint = new EndpointAddress("http://localhost:63566/Service1.svc");
using (ChannelFactory<IService1> myChannelFactory = new ChannelFactory<IService1>(myBinding, myEndpoint))
{
IService1 instance = myChannelFactory.CreateChannel();
myChannelFactory.Closed += ChannelFactory_Closed;
((IClientChannel)instance).Closed += Channel_Closed;
Console.WriteLine(instance.GetData(x));
((IClientChannel)instance).Close();
}
}
private void ChannelFactory_Closed(object sender, EventArgs e)
{
Console.WriteLine("Factory closed.");
}
private void Channel_Closed(object sender, EventArgs e)
{
Console.WriteLine("Channel closed.");
}
上記の画像リンクは新しい出力で更新されています。私は新しいものを追加しますが、私はもっと評判がなくなるまでできません。
問題の原因となっているチャネルファクトリは本当ですか?あなたは*チャンネル*を閉じなかったことがわかります。 WCFを使用する場合の推奨方法は、ファクトリインスタンスを作成する時間が長くかかるため、ファクトリインスタンスを長く保つことです。工場で作成したチャネルは、使用後に閉鎖する必要があります。 – Thuan
私はそれがチャンネルファクトリーであるかどうかはわかりません。私はusingステートメント内でチャンネルを閉じようとしましたが、何の違いもありませんでした。また、コンソールに書き込むために、両方のクローズイベントハンドラにイベントを追加しました。両方のイベントはコールのあいだでヒットしました。私はこの余分な情報で問題をアップデートするために今夜試してみるでしょう。 – Bobmonga