【发布时间】:2011-01-05 19:29:35
【问题描述】:
我正在 .NET 4 中实现我的第一个 REST 服务,但遇到了一些意想不到的事情。好像不太理解微软ServiceModel的下划线工作原理,但是用传统的方式也找不到答案。
为了实现我的网络服务,我按照本教程中的步骤操作:http://blogs.msdn.com/b/endpoint/archive/2010/01/06/introducing-wcf-webhttp-services-in-net-4.aspx
服务有效。令我惊讶的是 Global.asax 中的 Application_BeginRequest 和 Application_EndRequest 是由不同的线程调用的。查看堆栈跟踪,这些线程似乎基于某种线程池。
如果不进行一些重构,这对我们来说是个问题,因为我们总是假设单个请求将始终在同一个线程上运行,因此我们将一些变量存储在线程本地存储中。变量在 Application_BeginRequest 中初始化并在 Application_EndRequest 中释放。看来使用 ServiceModel 这不是正确的方法。
我的问题是:
- 当我使用 ServiceModel 时,我能否假设哪些线程正在运行我的代码?
- 有什么方法可以将执行限制为单个线程?出于某种原因,这会很糟糕吗?
- 在使用 ServiceModel 时,在请求期间存储变量的正确方法是什么?
谢谢。
【问题讨论】:
-
对最初问题的更新。它的一个线程调用 Application_BeginRequest,另一个线程运行服务代码并执行 Application_EndRequest。更改 ServiceBehavior 参数没有做任何事情。任何帮助将不胜感激。
-
听起来你正在使用 asp.net 兼容性的东西,或者尝试。您是否尝试过将您的东西实现为消息调度程序或任何其他 wcf 扩展点(而不是使用 asp.net)?
-
@Simon Svensson 我正在关注微软的教程blogs.msdn.com/b/endpoint/archive/2010/01/06/…。这似乎使用 asp.net 兼容性。如果使用其他方法会有什么不同?有什么好地方可以读一读吗?谢谢!
-
@OP:你有没有解决这个问题?
标签: c# asp.net web-services rest