現在、私は理解できない問題に直面しています。同時に複数のスレッドを介して(両方とも同じマシン上で)wcfサービスを呼び出すwcfクライアントがあります。時々、よく知られているSystem.ServiceModel.CommunicationExceptionに遭遇します
「xxxへのHTTP応答の受信中にエラーが発生しました。これは、HTTPプロトコルを使用していないサービスエンドポイントバインディングが原因である可能性があります。これは、サーバーによってHTTP要求コンテキストが中止されたことが原因である可能性もあります(サービスのシャットダウンが原因である可能性があります)。 )詳細については、サーバーログを参照してください。」、
時々それは動作します。サービス呼び出しが成功した場合、それは完全にランダムに見えます。
リクエストは非常に小さく、(int、bool、enum)呼び出しにすぎません。リクエストには約が含まれています。MSSQLデータベースからの300〜500KBのレコード。
私はWebサイトで何百ものソリューションを検索し、タイムアウト値、バッファー値、クライアント側とサービス側の要求と応答のサイズ値を増やしました。[DataContract]属性と[DataMember]属性が欠落している場合は、それらを追加しました。それでも変化はありません。
非常に奇妙な動作を確認するために、完全なトレースをアクティブにしました。
クライアントからの呼び出しは、指定された例外を除いてローカルで停止しますが、サーバーはそれらを処理して応答を送信しますが、クライアントには到達しません。指定されたトレースで時間を確認します。クライアントは中止し、サーバーは続行します。
トレースでは、次のグラフのような重さがわかります。
どうか、誰かがこの無限の検索を止めるのを手伝ってもらえますか?
アップデート1:
クライアントとサーバーの構成をアップロードしました。これが役立つかもしれません。
アップデート2:
Yahiaから提案されたように、ConnectionLimit(connection = 80)の構成パラメーターを含めました。現在、これで問題は解決したようですが、それでもエラーの再現を試みています。
アップデート3:
くそ。3時間後、同じ動作が再び見られます...別の提案がありました。ご覧のとおり、クライアントでは20スレッドから始まるquartz.netを使用しています。クォーツエンジンが実行するジョブは、当社のサービスに接続します。ここで、たとえば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 Settings-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: