目前我面临一个我不明白的问题。我有一个 wcf 客户端,它同时通过多个线程(都在同一台机器上)调用 wcf 服务。有时,我遇到众所周知的 System.ServiceModel.CommunicationException
“接收对 xxx 的 HTTP 响应时发生错误。这可能是由于服务端点绑定未使用 HTTP 协议。这也可能是由于服务器中止 HTTP 请求上下文(可能是由于服务关闭) )。有关更多详细信息,请参阅服务器日志。” ,
有时它会起作用。如果服务调用成功,这似乎是完全随机的。
请求非常小,它只是一个 (int, bool, enum) 调用。该请求包含约。来自 MSSQL 数据库的 300-500 KB 记录。
我在网站上搜索了数百个解决方案,增加了客户端和服务端的超时值、缓冲区值、请求和响应大小值。如果缺少它们,我添加了 [DataContract] 和 [DataMember] 属性。仍然没有任何变化。
我激活了完全跟踪,只是为了看到一个非常奇怪的行为:
来自客户端的调用因给定异常而在本地停止 - 但服务器处理它们并发送响应,该响应永远不会到达客户端。检查给定跟踪的时间 - 客户端中止,服务器继续。
在跟踪中,我看到了这张图中的重量:
拜托,任何人都可以帮助停止这种无休止的搜索吗?
更新1:
更新 2:
根据 Yahia 的建议,我们包含了ConnectionLimit (connection=80) 的配置参数。目前,这似乎解决了问题,但我们仍然尝试重现错误。
更新 3:
该死。三个小时后,我可以再次看到相同的行为......我们有另一个建议:如您所见,我们在客户端使用quartz.net,从20个线程开始。石英引擎执行的作业连接到我们的服务。现在我试着想象如果 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: