【问题标题】:ASP.NET Core ChannelFactory Leaving Connections OpenASP.NET Core ChannelFactory 保持连接打开
【发布时间】: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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-18
    相关资源
    最近更新 更多