[英]WCF REST service and client notifications
這是我的情況:我有一個Firebird數據庫,一個WCF REST服務(.NET 4.5)和一個Windows Mobile 6客戶端。 我需要的是:在Firebirds發布事件中,WCF REST應該通知客戶端。
我知道WCF用作SOAP服務時具有雙工通信,但是由於框架版本不兼容,我無法使用它。 有任何想法嗎? 這是否有可能,如果沒有其他選擇? 我通常對WCF還是陌生的,所以我可能會缺少一些東西,但是找不到適合我的特殊情況的東西。
附言:如果您需要我服務中的代碼段,請告訴我。 有很多東西,我正在努力使這篇文章盡可能整潔。
我將通過WCF使用ASP.NET Web API 2來開發Rest服務和SignalR 。
Web API將用於您的REST Web服務,當Firebird發布事件時,SignalR會通知您的所有客戶端。
SignalR允許服務器和客戶端之間的雙向通信。
樣本中心:
public class SomeHub: Hub
{
public void Send(string name, string message)
{
Clients.All.broadcastMessage(name, message);
}
}
我找到了解決方案,但我不確定它有多好。 首先,我制作了用於“訂閱”事件的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才能起作用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.