c# - 客户端 CommunicationException 而服务正常工作

标签 c# asp.net .net wcf exception

目前我遇到了一个我不明白的问题。我有一个 wcf 客户端,它同时通过多个线程调用 wcf 服务(都在同一台机器上)。有时,我会遇到众所周知的 System.ServiceModel.CommunicationException

“接收到 xxx 的 HTTP 响应时发生错误。这可能是由于服务端点绑定(bind)未使用 HTTP 协议(protocol)。这也可能是由于 HTTP 请求上下文被服务器中止(可能是由于服务关闭)。有关详细信息,请参阅服务器日志。” ,

有时它会起作用。如果服务调用成功,这似乎完全是随机的。

请求很小,只是一个 (int, bool, enum) 调用。该请求包含 ca。来自 MSSQL 数据库的 300-500 KB 记录。

我在数百个网站上搜索了解决方案,增加了客户端和服务端的超时值、缓冲区值、请求和响应大小值。如果缺少 [DataContract] 和 [DataMember] 属性,我会添加它们。仍然没有变化。

我激活了完整的跟踪,只是为了看到一个非常奇怪的行为:

来自客户端的调用因给定的异常而在本地停止 - 但服务器处理它们并发送响应,该响应永远不会到达客户端。检查给定跟踪的时间 - 客户端中止,服务器继续。

在跟踪中,我看到了这张图中的重量:

enter image description here

拜托,任何人都可以帮助停止这种无休止的搜索吗?

更新 1:

我上传了 clientserver配置,也许这​​有帮助。

更新 2:

我们包括了 config parameter对于 ConnectionLimit (connection=80),正如 Yahia 所建议的。目前,这似乎解决了问题,但我们仍然尝试重现错误。

更新 3:

该死的。三个小时后,我再次看到同样的行为……我们有另一个建议:如您所见,我们在客户端使用 quartz.net,从 20 个线程开始。 quartz 引擎执行的作业连接到我们的服务。现在我试着想象如果有 7 个线程同时尝试连接服务会发生什么。

更新 4:

我们已经在注册表和配置中设置了 tcp 参数。重启后,完全没有变化:(

这些是注册表更改:

HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters - TcpNumConnections=65534
HKLM\System\CurrentControlSet\Services\Tcpip\Parameters - MaxUserPort=65534
HKCU\Software\Microsoft\Windows\CurrentVersion\Internet 设置 - MaxConnectionsPer1_0Server=20
HKLM\Software\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_MAXCONNECTIONSPERSERVER - iexplore.exe=20
HKLM\Software\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_MAXCONNECTIONSPERSERVER - MyClientsExeName.exe=20

更新 5:

Client Trace Server Trace

更新 6:

[DataContract]
public class Currency
{
    [DataMember]
    public int Id { get; set; }

    [DataMember]
    public string Code { get; set; }

    [DataMember]
    public string Name { get; set; }

    [DataMember]
    public ForeignNoteDetails ForeignNoteDetails { get; set; }

    [DataMember]
    public CurrencyRates Rates { get; set; }

    [DataMember]
    public PreciousMetallDetails PreciousMetallDetails { get; set; }

    [DataMember]
    public CurrencyType Type { get; set; }
}

[DataContract]
public class ForeignNoteDetails
{
    [DataMember]
    public double CardholderBillingCurrencyCode { get; set; }

    [DataMember]
    public string Country { get; set; }

    [DataMember]
    public string CountryCode { get; set; }

    [DataMember]
    public int CurrencyUnit { get; set; }

    [DataMember]
    public List<string> Notes { get; set; }
}

[DataContract]
public class CurrencyRates
{
    [DataMember]
    public ExchangeRate PurchaseRate { get; set; }

    [DataMember]
    public ExchangeRate SellRate { get; set; }
}

[DataContract]
public class PreciousMetallDetails
{
    [DataMember]
    public string PreciousMetalType { get; set; }

    [DataMember]
    public double Fineness { get; set; }
}

调用服务:

        protected IEnumerable<Currency> GetCurrencyLevel(int id, bool netRate = true, RatesCalculationSource ratesSource = RatesCalculationSource.ReutersRates)
    {
        return this.calculationClient.GetCurrencyLevel(new RatesCalculationSetting() { CalculationLevelId = id, CalculateGrossRates = !netRate, Soruce = ratesSource });
    }

客户端创建:

protected ICalculationServiceClientService calculationClient = IoC.DependencyManager.Resolve<ICalculationServiceClientService>();

对服务的另一个调用(工作):

this.calculationClient.DistributeTradingOfficeRatesLevels(branchOfficeLevelId, tradingLevelId);

这里定义为

void DistributeTradingOfficeRatesLevels(int branchOfficeRatesLevelId, int tradingOfficeRatesLevelId)

更新 7:

Exception details

最佳答案

好的,这就是发生的事情——你有一个有故障的网卡,它在几个小时后过热,当这种情况发生时它开始短路,结果你的客户端“认为”服务器已关闭。故事结束 - 100% 确定。我的赏金呢?

顺便说一句:它过热要么是设计不良的原因,特别是如果您使用的是笔记本电脑,要么是因为它已经存在损坏。

关于c# - 客户端 CommunicationException 而服务正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15429934/

相关文章:

c# - 使用 Excel 互操作设置单元格值

c# - 如何更改 TabControl.Header 的背景颜色

.net - 需要 firebird 事件监听器第二次连接到 .NET 上的服务器吗?

.net - Visual Basic 2012 中的按钮单击修饰符

c# - ASP.net MVC - 每个 View 或每个操作一个 ViewModel?

c# - 在 C# 中使用模拟测试成员分配

c# - Redis MQ队列深度监控

Javascript返回值在onclientclick之后运行onclick

asp.net - 404 处理程序出现 "Handle is not initialized"异常

c# - MySqlDataReader dataReader =cmd.ExecuteReader() 不进入while循环弹出窗口Form