0

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 内で非同期呼び出しが発生したためであり、したがってアイテムです。

4

1 に答える 1

1

「状態」を保存しようとしないでください。成功したとしても、複数のサーバーを使用する場合、このソリューションは拡張できません。

リクエストごとにGUIDを生成できます。

Guid.NewGuid()

そしてそれをIDとして使用します。

于 2013-01-25T16:55:08.597 に答える