【问题标题】:WebService logging a unique id per WebMethod requestWebService 记录每个 WebMethod 请求的唯一 ID
【发布时间】:2013-01-25 16:32:45
【问题描述】:

我正在向作为 Windows 服务运行的 .Net ASMX WebService 添加一个日志系统。 目的是在不同的请求 ID 下记录对 WebMethod 的每次调用,以便能够在日志中识别为特定请求所做的所有条目。

为了进一步设置场景,每个 WebMethod 都会创建 HttpWebRequest 以与其他主机通信。

在解决问题的第一次尝试中,我使用以下方法存储每个线程的请求 ID:

  • [ThreadStatic] static int requestId

  • Thread.GetDataThread.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


【解决方案1】:

不要尝试保存“状态”,即使您成功了,当您想要使用多个服务器时,此解决方案也无法扩展。

您可以为每个请求生成一个 GUID。

Guid.NewGuid()

并将其用作 ID。

【讨论】:

  • 是的,这是有道理的,我同意。问题不在于生成请求 id,而 guid 非常有意义。我试图将它存储在某处的原因是由于写入静态日志,例如 Log.Debug(message)。这些在整个代码中,我试图减少添加请求 id 作为参数的需要,因为日志写入分散在整个代码中。
  • 您可以在日志基础架构中生成 GUID。
猜你喜欢
  • 1970-01-01
  • 2023-03-06
  • 2012-12-31
  • 1970-01-01
  • 1970-01-01
  • 2021-10-04
  • 2020-02-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多