2016-10-11 212 views
0

这是我的情况:我有一个Firebird数据库,一个WCF REST服务(.NET 4.5)和一个Windows Mobile 6客户端。我需要的是:在Firebirds发布事件后,WCF REST应通知客户端。WCF REST服务和客户端通知

我知道WCF在作为SOAP服务使用时具有双工通信,但由于框架版本不兼容,我无法使用它。有任何想法吗?这甚至有可能,如果没有,有没有其他的选择?我一般都是新来的WCF,所以我可能错过了一些东西,但我找不到对我的特定情况有帮助的东西。

P.S如果您需要我服务中的代码片段,请告诉我。有很多,我试图保持这个帖子尽可能干净。

回答

0

我会用WCF上的ASP.NET Web API 2来开发Rest服务和SignalR

Web API将用于您的REST Web服务和SignalR在Firebird发布事件时通知所有客户端。

SignalR允许服务器和客户端之间的双向通信。

样品枢纽:

public class SomeHub: Hub 
{ 
    public void Send(string name, string message) 
    { 
     Clients.All.broadcastMessage(name, message); 
    } 
} 
+0

这不适用于我,因为SingalR的客户端不支持windows .net CE,尽管对于未来的项目仍然有用。 – Aleksandar

0

我找到了解决办法,但我不完全知道它有多好。 首先,我所做的是用来“订阅”事件

接口声明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。

P.S.您应该将您的InstanceContextMode设置为PerCall以使其工作。