【发布时间】:2013-01-25 16:32:45
【问题描述】:
我正在向作为 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 有时可能为空。 p>
进一步调查我认为这可能是由于在 WebMethod 中发送了 HttpWebRequest,我认为这是由于 HttpWebRequest 中发生的异步调用可能会丢失原始 HttpContext 并因此丢失它的项目。
【问题讨论】:
-
如何让您的 ASMX 服务作为 Windows 服务运行?这不是开箱即用的功能。 OOB,仅支持 IIS 作为主机。
-
不清楚你想达到什么目标?您想为每个请求使用不同的 ID,还是想为每个“会话”使用相同的 ID?
-
John,我们有自己的 http 服务,它创建了一个 HttpListener。为传递给 HttpRuntime.ProcessRequest 的请求创建一个 HttpServerWorkerRequest。
-
Maxim,每个请求的 ID 不同。问题是试图在我们的日志架构中获取一个 id,这是一个具有静态日志方法的静态定义类。这就是为什么我一直在尝试使用 HttpContext.Current 等,因为它可以通过这种方式访问。
标签: .net web-services asynchronous asmx webmethod