Windows サービスとして実行されている .Net ASMX WebService にログ システムを追加しています。目的は、特定のリクエストに対して作成されたすべてのエントリをログで識別できるように、異なるリクエスト ID で WebMethod への各呼び出しをログに記録することです。
シーンをもう少し設定するために、各 WebMethod は、他のホストと通信するための HttpWebRequest を作成します。
問題を解決するための最初の試みでは、次を使用してスレッドごとにリクエスト ID を保存することを利用しました。
[ThreadStatic] static int requestId
Thread.GetDataおよびThread.SetDataを使用して、スレッドごとにリクエスト ID を格納します。
しかし、リクエストがスレッドを交換していて、これは信頼できないことにすぐに気付きました。
最後に、HttpContext.Current.Itemsを使用して WebMethod リクエストごとにリクエスト ID を保存しようとしましたが、HttpContext.Current.Items が時々空になる可能性があるため、これは完全に信頼できるものではありませんでした。
さらに調査すると、これは WebMethod 内で HttpWebRequest の送信が原因である可能性があると考えられます。これは、元の HttpContext を失う可能性がある HttpWebRequest 内で非同期呼び出しが発生したためであり、したがってアイテムです。