[英]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.