WCF REST服务和客户端通知
问题描述:
这是我的情况:我有一个Firebird数据库,一个WCF REST服务(.NET 4.5)和一个Windows Mobile 6客户端。我需要的是:在Firebirds发布事件后,WCF REST应通知客户端。WCF REST服务和客户端通知
我知道WCF在作为SOAP服务使用时具有双工通信,但由于框架版本不兼容,我无法使用它。有任何想法吗?这甚至有可能,如果没有,有没有其他的选择?我一般都是新来的WCF,所以我可能错过了一些东西,但我找不到对我的特定情况有帮助的东西。
P.S如果您需要我服务中的代码片段,请告诉我。有很多,我试图保持这个帖子尽可能干净。
答
我会用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);
}
}
答
我找到了解决办法,但我不完全知道它有多好。 首先,我所做的是用来“订阅”事件
接口声明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以使其工作。
这不适用于我,因为SingalR的客户端不支持windows .net CE,尽管对于未来的项目仍然有用。 – Aleksandar