繁体   English   中英

WCF REST服务和客户端通知

[英]WCF REST service and client notifications

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

我知道WCF用作SOAP服务时具有双工通信,但是由于框架版本不兼容,我无法使用它。 有任何想法吗? 这是否有可能,如果没有其他选择? 我通常对WCF还是陌生的,所以我可能会缺少一些东西,但是找不到适合我的特殊情况的东西。

附言:如果您需要我服务中的代码段,请告诉我。 有很多东西,我正在努力使这篇文章尽可能整洁。

我将通过WCF使用ASP.NET Web API 2来开发Rest服务和SignalR

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

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。

PS您应该将InstanceContextMode设置为PerCall才能起作用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM