【问题标题】:Does WCF Run the session on more than one thread?WCF 是否在多个线程上运行会话?
【发布时间】:2013-05-01 14:15:58
【问题描述】:

我有一个 wcf 服务(托管在 IIS 中),它是 setup to use sessions。它似乎工作。当Application_PostAcquireRequestState 被调用时,我有一个会话ID。

我最终像这样使用它(在我的 Global.asax 中):

if (Context.Handler is IRequiresSessionState)
{
    log4net.ThreadContext.Properties["sessionId"] = Session.SessionID;
}

这似乎工作正常。该值存储在我的 log4net 属性中。

但是当我的服务操作开始时(我的实际 WCF 服务代码),log4net 属性再次为空。

由于属性是按线程存储的 (ThreadContext),我只能假设这意味着会话是在一个线程上设置的,然后在另一个线程上执行。我说的对吗?

有没有办法在正确的线程上设置我的 log4net 属性(不必记住在每个服务操作开始时进行上述调用)?

【问题讨论】:

  • 我总是希望涉及多个线程。我不确定我在哪里捡到的。您是否考虑过服务本身的(自定义)行为以实现您想要的?

标签: c# .net wcf log4net


【解决方案1】:

是的,IIS 可以使用多个线程来服务多个 WCF 请求。详情请参阅http://msdn.microsoft.com/en-us/library/cc512374.aspx

您可以考虑为每个 WCF 请求使用不同的记录器实例。

【讨论】:

  • 你说“多线程服务多个 WCF 请求”。我说的是单个 WCF 调用...(不是多个)
【解决方案2】:

在多种情况下,WCF 可能会更改您身上的线程:

  1. 不保证 Global.asx 线程可用于服务调用(实际上不太可能)。
  2. 如果在同一个会话期间有多个调用,线程也可能在对同一个服务实例的调用之间发生变化。

理论上,像这样的状态信息应该存储在操作上下文对象中。然而,由于 log4net 使用线程本地存储,它成为一个尴尬的解决方案。

有没有办法让我的 log4net 属性设置在正确的 线程(不必记住在开始时进行上述调用 每一个服务操作)?

是的。创建自定义IOperationInvoker。我所知道的最好的例子是Carlos Figueira's blog如果您将此作为服务行为应用,则应该始终为服务代码定义 log4net 属性。

一个警告:添加到线程本地存储时一定要清理。这就是 log4net.ThreadContext.Stacks[].Push() 返回 IDisposable 的原因。换句话说,您的 Invoke 方法应该看起来像(不完整且未经测试):

public object Invoke(object instance, object[] inputs, out object[] outputs)
{
    using (log4net.ThreadContext.Stacks[key].Push(value))
    {
        return this.originalInvoker.Invoke(instance, inputs, out outputs);
    }
}

请参阅 Carlos 的博客,了解您为何称其为“originalInvoker”。请注意,如果您想支持异步操作,则需要实现其他方法。

【讨论】:

    【解决方案3】:

    自定义属性不需要是字符串。因此,您可以在全局上下文中存储以下类的实例:

    public class SessionIdProperty 
    {
        public override string ToString()
        {
            // error handling omitted
            return Session.SessionID;
        }
    }
    

    这样 log4net 可以在记录消息时直接访问Session 对象。 Log4net 对非字符串属性调用 ToString() 方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多