我找到了解决方案,但我不完全确定它有多好。首先,我制作了用于“订阅”事件的 WCF 方法
接口声明
[OperationContract]
[WebInvoke(Method = "GET",
BodyStyle = WebMessageBodyStyle.Bare, UriTemplate = "Notification")]
Stream Notification();
服务类实现
public Stream Notification()
{
string result= "";
using (FbConnection conn= new FbConnection(ConfigurationManager.ConnectionStrings["DB"].ConnectionString))
{
conn.Open();
FbRemoteEvent events= new FbRemoteEvent(conn, "event1", "event2", "event3", "event4");
events.QueueEvents();
AutoResetEvent waitHandle = new AutoResetEvent(false);
eventi.RemoteEventCounts += (sender, args) =>
{
if (args.Counts > 0)
{
result= args.Name;
waitHandle.Set();
}
};
waitHandle.WaitOne();
}
return new MemoryStream(Encoding.UTF8.GetBytes(result));
}
我正在使用 AutoResetEvent 冻结服务实例,直到 post_event 发生,一旦发生,调用 AutoResetEvent 的 Set() 方法来解冻服务并返回我的案例事件名称,所以我知道触发了哪个事件。在客户端,我在单独的线程中调用此方法并等待其响应,一旦我得到它,我会相应地处理它并再次重新发送相同的方法请求,以便我可以捕获下一个 post_event。
PS 您应该将 InstanceContextMode 设置为 PerCall 才能正常工作。