【发布时间】:2017-08-05 12:57:43
【问题描述】:
我已开始将现有的 ASP.Net Framework 项目转换为 ASP.NET Core 项目。其中一个组件是使用 ChannelFactory 的 WCF Wrapper。我能够毫不费力地将其转换为在 ASP.NET Core 项目中运行。但是,在测试新的 ASP.NET Core 项目时,我注意到正在建立连接。为了调查这个问题,我创建了两个控制台项目(一个 ASP.NET Framework 和另一个 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));
}
上面的代码被调用了5次。每个服务调用的输出与进程的 NETSTAT 输出一起发送到控制台。
ASP.NET 框架的输出是:
ASP.NET Core 的输出是:
如您所见,对于 ASP.NET Core 版本,连接保持打开状态。这两个项目的代码是相同的。据我所知,主要区别在于 ASP.NET Framework 将使用 System.ServiceModel 4.0.0.0,而 ASP.NET Core 将使用 System.ServiceModel.Primitives 4.1.1.0。这是一个错误,一个预期的功能,还是我在做一些愚蠢的事情?如果这是一个错误,我会感到非常惊讶,但我们的吞吐量非常高,并且保持打开的连接可能会导致生产出现问题。
更新
我添加了额外的代码来关闭通道,并将 ChannelFactory 和 Channel 的关闭事件的日志记录添加到控制台。现在的代码是:
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 的推荐方法是长时间保留工厂实例,因为创建它的成本很高。是工厂创建的通道,使用后需要关闭。
-
我不确定是不是 Channel Factory 编号。我尝试在 using 语句中关闭通道,但没有任何区别。我还将事件添加到他们关闭的事件处理程序中以写入控制台。这两个事件都发生在通话之间。我今晚会找时间用这些额外的信息更新问题。
标签: c# wcf asp.net-core channelfactory