【问题标题】:Can I count on thread affinity in an ASMX web service app?我可以指望 ASMX Web 服务应用程序中的线程亲和性吗?
【发布时间】:2013-04-01 23:22:18
【问题描述】:

我有一个“企业”项目,它有很多很多层。 WinForms 客户端连接到 Web 服务,该服务调用业务层,该业务层从另一个系统调用转换层,该转换层又调用多个包装器以最终更新一个值。不开玩笑 - 这就是 12 年的持续发展将要做的事情。

我现在必须将一个 ID 从客户端一直传递到数据库层。 ID 必须随每个请求一起旅行。我最初的想法是一直探查它,但这会非常耗时且几乎不可能(几乎一路下来都有大量的静态疯狂)。

所以我正在考虑将此 ID 分配给 ASP.NET Web 服务应用程序的 Application_BeginRequest 中的 ThreadLocalStorage。然后最后一个与数据库通信的库可以读取该值并将其传递给数据库。

我的问题是:我可以计算从Application_BeginRequest 一直到链中最后一个库的线程亲和性吗?

【问题讨论】:

  • 只要你不利用线程池等。
  • ASMX 是一项遗留技术,不应用于新开发。 WCF 应该用于 Web 服务客户端和服务器的所有新开发。一个提示:Microsoft 已停用 MSDN 上的 ASMX Forum。底线:对于任何事情,我都不会依赖它,更不用说我会依赖未记录的行为。
  • @JohnSaunders 这不是新的发展。正如我的问题所述,过去 12 年来一直在努力。
  • 更有理由不指望老狗学习新技巧。
  • @JohnSaunders 你是否建议我使用一种新的闪亮技术重写整个东西,以便我可以通过系统传递一个 ID?

标签: c# asp.net web-services thread-safety asmx


【解决方案1】:

您最好使用HttpContext.Items

如果您决定使用异步页面 HttpContext(包括项目)将正确移动到新线程,但普通 TLS 不会。

请注意,如果您不依赖 ASP.Net 线程管理(即创建自己的线程/使用线程池/或像 .ParallelFor 这样的任何方法),则需要确保将上下文正确地传递给新线程(即分配HttpContex.Current 早期在新线程上运行)。如果您希望多个线程同时处理单个请求,我建议不要使用 HttpContext.Items

【讨论】:

  • 这是个好主意。我的问题是堆栈最底部的库也被非 Web 客户端使用。他们很难创建 HttpContext.Items 对象(如果我错了,请告诉我)。
  • 我没有创建任何线程,也没有使用 ThreadPool。多个线程究竟如何处理同一个请求?不确定我是否关注你。
  • @AngryHacker - 如果您在请求期间使用.Parallel.For,那么多个线程可能需要同时访问有关“当前请求”的信息...
  • @AngryHacker on TLS 可能没问题 - 如果确实没有涉及多个线程,您可能需要查看代码...如果您不使用异步页面,则单个请求由来自的单个线程提供从头到尾。
猜你喜欢
  • 2019-03-07
  • 1970-01-01
  • 1970-01-01
  • 2012-07-10
  • 2017-12-06
  • 2016-03-28
  • 2019-01-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多