目前我遇到了一个我不明白的问题。我有一个 wcf 客户端,它同时通过多个线程调用 wcf 服务(都在同一台机器上)。有时,我会遇到众所周知的 System.ServiceModel.CommunicationException
“接收到 xxx 的 HTTP 响应时发生错误。这可能是由于服务端点绑定(bind)未使用 HTTP 协议(protocol)。这也可能是由于 HTTP 请求上下文被服务器中止(可能是由于服务关闭)。有关详细信息,请参阅服务器日志。” ,
有时它会起作用。如果服务调用成功,这似乎完全是随机的。
请求很小,只是一个 (int, bool, enum) 调用。该请求包含 ca。来自 MSSQL 数据库的 300-500 KB 记录。
我在数百个网站上搜索了解决方案,增加了客户端和服务端的超时值、缓冲区值、请求和响应大小值。如果缺少 [DataContract] 和 [DataMember] 属性,我会添加它们。仍然没有变化。
我激活了完整的跟踪,只是为了看到一个非常奇怪的行为:
来自客户端的调用因给定的异常而在本地停止 - 但服务器处理它们并发送响应,该响应永远不会到达客户端。检查给定跟踪的时间 - 客户端中止,服务器继续。
在跟踪中,我看到了这张图中的重量:
拜托,任何人都可以帮助停止这种无休止的搜索吗?
更新 1:
我上传了 client和 server配置,也许这有帮助。
更新 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:
更新 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:
最佳答案
好的,这就是发生的事情——你有一个有故障的网卡,它在几个小时后过热,当这种情况发生时它开始短路,结果你的客户端“认为”服务器已关闭。故事结束 - 100% 确定。我的赏金呢?
顺便说一句:它过热要么是设计不良的原因,特别是如果您使用的是笔记本电脑,要么是因为它已经存在损坏。
关于c# - 客户端 CommunicationException 而服务正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15429934/