有点标题党了,最近因工作需要,想利用WCF的Duplex服务向Winform程序推送消息,写了个示例,主要参考了artech的相关文章和其他一些利用WCF向SilverLight客户端推送消息的文章。
先看运行效果:在网页中发送消息【如图】,Winform端接收到消息


先建立两个项目,一个WebForm 项目和一个WinForm项目,并在项目下建立好各自需要的文件


SendMessage.aspx 是发送消息的Web页面
ISendMessageService.cs 和 SendMessageService.svc用来实现WCF的Duplex服务
GetMessageForm.cs 是接收消息的Winform窗口
当然,还需要建立一个消息实体文件:MessageEntity.cs,为简单起见,只给他定义一个属性。

 [DataContract]
    public class MessageEntity
    {
        [DataMember]
        public string Content { get; set; }
    }

基本原理是消息发送的页面将要发送的消息列表保存在全局缓存中,在WCF服务中取得要发送的消息推送

到Winform端,SendMessage.aspx的代码如下:

Code
 protected void btnSend_Click(object sender, EventArgs e)
        {
            MessageEntity message = new MessageEntity();
            message.Content = txtMessageContent.Text;

List<MessageEntity> messageList = HttpRuntime.Cache["MessageEntityList"] as List<MessageEntity>;
            if (messageList == null)
            {
                messageList = new List<MessageEntity>();
                messageList.Add(message);
                HttpRuntime.Cache.Add("MessageEntityList", messageList, null, System.Web.Caching.Cache.NoAbsoluteExpiration, System.Web.Caching.Cache.NoSlidingExpiration, System.Web.Caching.CacheItemPriority.Default, null);
            }
            else
            {
                messageList.Add(message);
                HttpRuntime.Cache["MessageEntityList"] = messageList;
            }

lbCacheCount.Text = messageList.Count.ToString();
        }

ISendMessageService.cs 用来定义消息接收接口和回调接口

Code
[ServiceContract(CallbackContract = typeof(ISendMessageServiceCallBack))]
    public interface ISendMessageService
    {
        [OperationContract(IsOneWay = true)]
        void GetMessage();
    }

public interface ISendMessageServiceCallBack
    {
        [OperationContract(IsOneWay = true)]
        void ReceiveMessage(MessageEntity messageEntity);
    }

SendMessageService.svc.cs 用来实现将缓存中的消息列表一个一个的推送出去,采用Timer类每2-5秒钟推送一次:

Code
 [ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple)]
    public class SendMessageService : ISendMessageService
    {
        ISendMessageServiceCallBack callback;
        Timer heartTimer;
        Random random = new Random();

#region ISendMessageService 成员

public void GetMessage()
        {
            callback = OperationContext.Current.GetCallbackChannel<ISendMessageServiceCallBack>();
            heartTimer = new Timer(new TimerCallback(heartTimer_Elapsed), null, 3000, Timeout.Infinite);
        }

#endregion

private void heartTimer_Elapsed(object data)
        {
            List<MessageEntity> messageList = HttpRuntime.Cache["MessageEntityList"] as List<MessageEntity>;
            if (messageList != null && messageList.Count > 0)
            {
                MessageEntity message = messageList[0];
                messageList.Remove(message);
                HttpRuntime.Cache["MessageEntityList"] = messageList;
                callback.ReceiveMessage(message);
            }
            int interval = random.Next(2000, 5000);
            heartTimer.Change(interval, Timeout.Infinite);
        }
    }

记得修改Web.Config中EndPoint Binding 为wsDualHttpBinding ,这样才支持Duplex服务

Code
<service behaviorConfiguration="WebApp.SendMessageServiceBehavior" name="WebApp.SendMessageService">
                <endpoint address="" binding="wsDualHttpBinding" contract="WebApp.ISendMessageService">
                    <identity>
                        <dns value="localhost"/>
                    </identity>
                </endpoint>
                <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
            </service>

WebApp项目的工作已经完成,若没有错误可在浏览器中看到该WCF服务已创建,拷贝该服务的地址,例如在我本机上是:http://localhost:1407/SendMessageService.svc,并在WinApp项目中增加该服务的引用
GetMessageForm.cs 实现如下:

Code
public partial class GetMessageForm : Form,ISendMessageServiceCallback
    {
        SendMessageServiceClient client;

public GetMessageForm()
        {
            InitializeComponent();
            client = new SendMessageServiceClient(new System.ServiceModel.InstanceContext(this));
        }

private void btnStartGet_Click(object sender, EventArgs e)
        {
            client.GetMessage();
        }

private delegate void UpdateListBoxDelegate(string Message);
        private void UpdateListBox(string message)
        {
            this.listbMessage.Items.Add(message);
            listbMessage.SelectedIndex = listbMessage.Items.Count - 1;
        }
        #region ISendMessageServiceCallback 成员

public void ReceiveMessage(MessageEntity messageEntity)
        {
            if (true == listbMessage.InvokeRequired)
            {
                listbMessage.Invoke(new UpdateListBoxDelegate(UpdateListBox), messageEntity.Content);
            }
            else
            {
                UpdateListBox(messageEntity.Content);
            }
        }

#endregion

}

源代码打包下载

转载于:https://www.cnblogs.com/xiaozhuang/archive/2009/07/22/1528712.html

贾君鹏你妈妈喊你回家吃饭-利用WCF的Duplex推送消息相关推荐

  1. 贾君鹏你妈妈喊你回家吃饭

    贾君鹏你妈妈喊你回家吃饭原贴地址: http://tieba.baidu.com/f?ct=335544320&lm=0&rn=30&tn=postBrowserN&s ...

  2. 寂寞,你妈妈喊你回家吃饭——寂寞是一种罪

    抵制寂寞!寂寞是一种罪! 最近流行一句话:贾君鹏,你妈妈喊你回家吃饭. 一时之间,天下之人,皆要回家吃饭 最近流行一个党:寂寞教当道 一时之间,哥吃的就不是面了,是寂寞 哥发的也不是帖了,是寂寞 哥浑 ...

  3. 【Spark你妈喊你回家吃饭-01】 Spark是什么鬼?

    经过一段时间的学习和测试,是时候给spark的学习经历做一个总结了,对于spark的了解相对晚了写.春节期间(预计是无大事),本博准备推出20篇左右spark系列原创文章(先把牛吹出去再说) ,尽量将 ...

  4. html5利用websocket完成的推送功能(tomcat)

    html5利用websocket完成的推送功能(tomcat) 利用websocket和java完成的消息推送功能,服务器用的是tomcat7.0.42,一些东西是自己琢磨的,也不知道恰不恰当,不恰当 ...

  5. 利用Comet4J 及时推送消息

    简介 Comet4J是一个微型的即时推送框架,它分为服务端与客户端两部分,你只要将服务器端(JAR文件,目前仅支持Tomcat6.7)放入WEB-INF\lib,客户端(JavaScript文件)引入 ...

  6. 利用server酱推送消息和定时库:APScheduler

    转载自公众号:python_shequ 最近工作比较繁杂,经常忘事,有时候记了备忘录结果却忘记看备忘录,但是微信是每天都会看的,于是就想到写一个基于微信的提醒系统.总体思路是将待办事项记录到在线记事本 ...

  7. 紧急提醒!黑客正利用假 ChatGPT 来推送恶意软件

    黑客正在利用 ChatGPT 的火爆为 Windows 和 Android 分发恶意软件. 整理 | 禾木木      责编 | 梦依丹 出品 | CSDN(ID:CSDNnews) 自 ChatGP ...

  8. FTP微软喊你回家吃饭

    现实生活中的信息安全一直不断验证那句俗语"春困夏乏秋无力,冬日正好眠",随着夏季的来临,昼长夜短,天气炎热,大洋彼岸的安全组织仍在昼伏夜出寻找"Exploit" ...

  9. 叶树:任总喊你回家吃饭 (zz)

    2010年10月30日,看过当月的<华为人>报后,本人在某网站发了如下短文. //z 2012-08-23 18:00:59 IS2120@CSDN.T3412314858[T2,L56, ...

  10. Flutter 萌新高频问题(加班猿妈妈叫你回家吃饭了)

    想写这个很久了,每个人都是从萌新来的,在一些国内Flutter群里(482462250,422833104)呆着, 经常有很多重复的问题在群里反复出现,导致群里大佬都不爱搭理了. 下面的目录会不断更新 ...

最新文章

  1. 【发现】Warcraft III v1.22 不用正版CDKey上Battle.net 续篇
  2. sap scc4 客户端设置
  3. python批量上传 服务器_Python Tornado批量上传图片并显示功能
  4. Restrictions查询用法
  5. php sqlite视图,SQLite 视图
  6. 开始开发HoloLens应用吧 Start Developing HoloLens Apps Today
  7. 内核中的TCP的追踪分析-9-TCP(IPV4)的socket的地址绑定--续2
  8. 网站常用组件收集整理
  9. 一个好用的用于前端的字体图标库
  10. Matlab画图程序
  11. 校园网接无线路由器多账号登录
  12. 超级好看的windows终端美化教程
  13. SAP Java Connector 错误 - JCO_ERROR_COMMUNICATION
  14. java减号的正则_java 正则匹配 特殊字符 减号- 的情况,处理方式
  15. tensorflow目标检测--识别赵丽颖
  16. lay-ui treeTable无限折叠
  17. anaconda中的pkgs文件清理
  18. 智能马桶盖松下好还是TOTO好?“资深”用户的对比贴来了
  19. python 发送匿名邮件或无发件人
  20. 【网盘项目日志】Seafile 源码部署和安装命令

热门文章

  1. 神经网络的Dropout正则化
  2. 【深度学习笔记】个人阅读的Deep Learning方向的paper整理
  3. Python实现将一个长度为n的列表划分 ,每个子列表中包含m个元素
  4. python实现求解给定整数的质因数
  5. Java 虚拟机学习
  6. python-random
  7. shell 除法保留n位小数
  8. pycharm git使用_通过Pycharm中的版本控制工具VCS使用Git
  9. DP之石子堆合并问题
  10. mysql查看表注释和字段注释