我正在将日志系统添加到作为 Windows 服务运行的 .Net ASMX WebService 中。目的是在不同的请求 ID 下记录对 WebMethod 的每次调用,以便能够在日志中识别为特定请求所做的所有条目。
为了进一步设置场景,每个 WebMethod 创建 HttpWebRequest 以与其他主机通信。
在解决问题的第一次尝试中,我使用以下方法存储每个线程的请求 ID:
[ThreadStatic] 静态 int requestId
Thread.GetData和Thread.SetData存储每个线程的请求 ID。
但是我很快意识到请求正在交换线程,这是不可靠的。
我最后尝试使用HttpContext.Current.Items来存储每个 WebMethod 请求的请求 ID,但这并不完全可靠,因为 HttpContext.Current.Items 有时可能为空。
进一步调查我认为这可能是由于在 WebMethod 中发送了 HttpWebRequest,我认为这是由于 HttpWebRequest 中发生的异步调用可能会丢失原始 HttpContext,因此它是项目。