ASP.NET Core ChannelFactory保持连接打开

时间:2017-08-05 12:57:44

标签: c# wcf asp.net-core channelfactory

我已经开始将现有的ASP.Net Framework项目转换为ASP.NET Core项目。其中一个组件是使用ChannelFactory的WCF Wrapper。我能够将它转换为在ASP.NET Core项目中运行而没有太多麻烦。但是,在测试新的ASP.NET Core项目时,我注意到连接正在建立。为了研究这个问题,我使用一个非常基本的ChannelFactory设置创建了两个控制台项目(一个ASP.NET框架和另一个ASP.NET Core):

 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 Framework的输出是:

ASP.NET Framework Output

ASP.NET Core的输出是:

ASP.NET Core Output

正如您所看到的,ASP.NET Core版本的连接仍然是开放的。这两个项目的代码完全相同。据我所知,主要的区别是ASP.NET Framework将使用System.ServiceModel 4.0.0.0而ASP.NET Core则使用System.ServiceModel.Primitives 4.1.1.0。这是一个错误,一个预期的功能,还是我在做一些愚蠢的事情?如果它是一个错误,我会感到非常惊讶,但我们的吞吐量非常高,而且连接保持打开可能会导致生产问题。

更新

我添加了额外的代码来关闭频道,并在ChannelFactory和Channel的Close事件上添加日志记录到控制台。代码现在是:

    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.");
    }

上面的图片链接已使用新输出进行了更新。我会添加新的,但直到我有更多声誉才能使用。

1 个答案:

答案 0 :(得分:2)

我与开发人员记录了一个issue,他们解释了为什么它会像这样。基本上,完整框架使用HttpWebRequest,而ASP.Net Core版本使用HttpClient。我知道我们不应该处理HttpClient,因为它导致端口耗尽,但不是ASP.NET Core ChannelFactory使用HttpClient。

相关问题