【问题标题】:WCF REST service and client notificationsWCF REST 服务和客户端通知
【发布时间】:2017-02-19 16:18:43
【问题描述】:

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

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

P.S 如果您需要我的服务提供的代码 sn-ps,请告诉我。有很多,我正在努力保持这篇文章尽可能干净。

【问题讨论】:

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


    【解决方案1】:

    我找到了解决方案,但我不完全确定它有多好。 首先,我制作了用于“订阅”事件的 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。

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

    【讨论】:

      【解决方案2】:

      我会使用 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);
          }
      }
      

      【讨论】:

      • 这对我不起作用,因为 Windows .net CE 不支持 SingalR 的客户端,但对于未来的项目仍然有用的建议。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多