WCF REST服务和客户端通知

时间:2016-10-11 06:57:48

标签: .net-4.5 wcf-rest windows-mobile-6 firebird-3.0

以下是我的情况:我有一个Firebird数据库,一个WCF REST服务(.NET 4.5)和一个Windows Mobile 6客户端。我需要的是:在Firebirds post事件上,WCF REST应该通知客户端。

我知道WCF在用作SOAP服务时具有双工通信,但由于框架版本不兼容,我无法使用它。有任何想法吗?这是否可能,如果没有,有没有其他选择?我通常是WCF的新手,所以我可能会遗漏一些东西,但是我找不到任何有用的东西。

P.S如果您需要我服务的代码段,请告诉我。有很多,我试图尽可能保持这篇文章的清洁。

2 个答案:

答案 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,以使其正常工作。