2016-10-11 322 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以使其工作。