0

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

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

PS如果您需要我的服务中的代码片段,请告诉我。它有很多,我正在努力保持这篇文章尽可能干净。

4

2 回答 2

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。

PS 您应该将 InstanceContextMode 设置为 PerCall 才能正常工作。

于 2016-10-12T10:33:55.437 回答
0

我会使用ASP.NET Web API 2 over WCF 来开发 Rest services 和SignalR

Web API 将用于您的 REST Web 服务和 SignalR,以便在 Firebird 发布事件时通知您的所有客户端。

SignalR 允许服务器和客户端之间的双向通信。

示例中心:

public class SomeHub: Hub
{
    public void Send(string name, string message)
    {
        Clients.All.broadcastMessage(name, message);
    }
}
于 2016-10-11T15:55:32.070 回答