以下是我的情况:我有一个Firebird数据库,一个WCF REST服务(.NET 4.5)和一个Windows Mobile 6客户端。我需要的是:在Firebirds post事件上,WCF REST应该通知客户端。
我知道WCF在用作SOAP服务时具有双工通信,但由于框架版本不兼容,我无法使用它。有任何想法吗?这是否可能,如果没有,有没有其他选择?我通常是WCF的新手,所以我可能会遗漏一些东西,但是我找不到任何有用的东西。
P.S如果您需要我服务的代码段,请告诉我。有很多,我试图尽可能保持这篇文章的清洁。
答案 0 :(得分:0)
我会使用ASP.NET Web API 2而不是WCF来开发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);
}
}
答案 1 :(得分: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,以使其正常工作。