gpt4 book ai didi

c# - 在 WCF 中,操作是否总是在与消息检查器相同的线程上调用?

转载 作者:行者123 更新时间:2023-11-30 20:04:03 26 4
gpt4 key购买 nike

我有一个 WCF 线程问题,我一直找不到好的答案。我有一个 IDispatchMessageInspector 的实现,它具有以下 AfterReceiveRequest 实现:

public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
{
return new SessionScope();
}

SessionScope 的构造函数将当前作用域注册到字典中,该字典基本上通过线程跟踪它。然后我有以下操作:

[MyServiceBehavior]
public class Service1 : IService1
{
public string GetData(int value)
{
// Uses SessionScope.Current object for various things
}
}

GetData 保证与之前检查 WCF 消息的消息检查器在同一线程上运行吗?同样,BeforeSendReply 是否也会在同一个线程上运行?

最佳答案

您不能保证请求将保留在同一个线程上。 IIS 可以(并且将会)在线程之间传递它。

要实现您的目标,您可以将您的对象加载到 OperationContext.Current(或 HttpContext.Current,如果您打开了 aspCompatibilityMode)。我通过将对象添加到 OperationContext.Extensions 列表来完成此操作:

首先,你的类必须实现 IExtension

public sealed class SessionScope : IExtension<OperationContext> {
// your class details here
}

然后您需要将您的对象添加到 OperationContext:

public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
{
SessionScope scope = new SessionScope();
OperationContext.Current.Extensions.Add( scope );
}

之后,无论线程切换如何,您都可以在任何地方使用它。

关于c# - 在 WCF 中,操作是否总是在与消息检查器相同的线程上调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13709545/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com