我的第一个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为空。怎么了,出了什么问题,怎么解决?
因为您不在操作的上下文中。
你只是在调用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
"函数应该是一个共享(静态)实现