我的第一个WCF服务器-为什么是OperationContext.Current为空

本文关键字:OperationContext Current 为空 为什么 第一个 WCF 服务器 我的 | 更新日期: 2023-09-27 18:08:06

我正在尝试实现我的第一个WCF回调服务器。这是我的代码:

[ServiceContract(SessionMode = SessionMode.Required, CallbackContract = typeof(ILogCallback))]
public interface ILog
{
}
public interface ILogCallback
{
    [OperationContract(IsOneWay = true)]
    void Push(string callbackValue);
}
public class MyLog : ILog
{
}
class Log
{

    public static void initialize()
    {
        using (ServiceHost host = new ServiceHost(
            typeof (MyLog),
            new Uri[]
                {
                    new Uri("net.pipe://localhost")
                }))
        {
            host.AddServiceEndpoint(typeof (ILog),
                                    new NetNamedPipeBinding(),
                                    "PipeReverse");
            host.Open();
            // TODO: host.Close();
        }
    }
    public static void Push(string s)
    {
        ILogCallback callbacks = OperationContext.Current.GetCallbackChannel<ILogCallback>();
        callbacks.Push(s);
    }
}

然后我尝试使用以下代码使用我的服务器:

        Log.initialize();
        while (true)
        {
            Log.Push("Hello");
            System.Threading.Thread.Sleep(1000);
        }

但是我得到了NPE,因为OperationContext。Current为空。怎么了,出了什么问题,怎么解决?

我的第一个WCF服务器-为什么是OperationContext.Current为空

因为您不在操作的上下文中。

你只是在调用Log类的一个静态方法。

如果你在一个操作上下文中,你的调用必须来自一个正在被你的WCF服务器服务的客户端。

OperationContext.Current是一个线程静态属性,在请求到达服务器时初始化。下面是调用回调

的方法
[ServiceContract(SessionMode = SessionMode.Required, CallbackContract = typeof(ILogCallback))]
public interface ILog
{
  void PushOnTheClient();
}
public class MyLog : ILog
{
  void PushOnTheClient()
  {
        ILogCallback callbacks = OperationContext.Current.GetCallbackChannel<ILogCallback>();
        callbacks.Push(s);
  }
}

您错过了订阅者的订阅。你这样做的方式是在你的MyLog WCF服务器上创建一个单向操作,叫做:"void SendMeLogs()"。这将打开客户端回调通道。然后,您必须在以下行中实现SendMeLogs():

void SendMeLogs()
{
  while(CheckLogsForNewData())
 {
   PushOnTheClient();
 }
}

由于SendMeLogs()函数是单向的,因此客户机不会阻塞,而是启动对日志服务器的订阅。(您可以在网上搜索WCF中双工计算器的示例代码,以获得这种体系结构的一个很好的示例)。然而,关键是你必须有一个不错的退订方法,如"StopSendingMeLogs"来打破循环,并使PushOnTheClient函数失效安全,以防客户端终止或特定的客户端连接断开。理想情况下," CheckLogsForNewData "函数应该是一个共享(静态)实现

相关文章:
  • 没有找到相关文章