【发布时间】:2013-03-15 10:27:42
【问题描述】:
目前我面临一个我不明白的问题。我有一个 wcf 客户端,它同时通过多个线程(都在同一台机器上)调用 wcf 服务。有时,我会遇到众所周知的 System.ServiceModel.CommunicationException
"接收对 xxx 的 HTTP 响应时发生错误。这可能是由于服务端点绑定未使用 HTTP 协议。这也可能是由于 HTTP 请求上下文被服务器中止(可能由于服务关闭)。有关更多详细信息,请参阅服务器日志。” ,
有时它会起作用。如果服务调用成功,这似乎是完全随机的。
请求非常小,它只是一个 (int, bool, enum) 调用。该请求包含约。来自 MSSQL 数据库的 300-500 KB 记录。
我在数百个网站上搜索了解决方案,增加了客户端和服务端的超时值、缓冲区值、请求和响应大小值。如果缺少它们,我添加了 [DataContract] 和 [DataMember] 属性。仍然没有任何变化。
我激活了完全跟踪,只是为了看到一个非常奇怪的行为:
来自客户端的调用因给定异常而在本地停止 - 但服务器处理它们并发送响应,该响应永远不会到达客户端。检查给定跟踪的时间 - 客户端中止,服务器继续。
在跟踪中,我看到了这个图中的重:
请问,谁能帮忙停止这种无休止的搜索?
更新 1:
我上传了 client 和 server 配置,也许这会有所帮助。
更新 2:
按照 Yahia 的建议,我们为 ConnectionLimit (connection=80) 添加了 config parameter。目前,这似乎解决了问题,但我们仍在尝试重现错误。
更新 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:
【问题讨论】:
-
我假设您已经在服务器和客户端绑定上设置了 TransportBindingElement 的 MaxReceivedMessageSize 属性。
-
您需要全局更改设置(通过注册表)... Quartz.net 可能正在做一些事情,阻止您的配置设置被正确应用(也许他们正在重用线程或类似的)...
-
非常好 - 我会尝试重现您的问题并在几分钟内通知您。
-
你能把对象初始化器从调用和测试中分离出来吗? protected IEnumerable
GetCurrencyLevel(int id, bool netRate = true, RatesCalculationSource ratesSource = RatesCalculationSource.ReutersRates) { var myObj = new RatesCalculationSetting() { CalculationLevelId = id, CalculateGrossRates = !netRate, Soruce = ratesSource }; var 结果 = this.calculationClient.GetCurrencyLevel(myObj);返回结果; } -
您能否显示您在 wcfclient 跟踪中收到的错误消息的详细信息?我的意思是该行的详细信息:“抛出异常”。
标签: c# asp.net .net wcf exception