贾君鹏你妈妈喊你回家吃饭-利用WCF的Duplex推送消息
有点标题党了,最近因工作需要,想利用WCF的Duplex服务向Winform程序推送消息,写了个示例,主要参考了artech的相关文章和其他一些利用WCF向SilverLight客户端推送消息的文章。
先看运行效果:在网页中发送消息【如图】,Winform端接收到消息
先建立两个项目,一个WebForm 项目和一个WinForm项目,并在项目下建立好各自需要的文件
SendMessage.aspx 是发送消息的Web页面
ISendMessageService.cs 和 SendMessageService.svc用来实现WCF的Duplex服务
GetMessageForm.cs 是接收消息的Winform窗口
当然,还需要建立一个消息实体文件:MessageEntity.cs,为简单起见,只给他定义一个属性。
public class MessageEntity
{
[DataMember]
public string Content { get; set; }
}
基本原理是消息发送的页面将要发送的消息列表保存在全局缓存中,在WCF服务中取得要发送的消息推送
到Winform端,SendMessage.aspx的代码如下:
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 用来定义消息接收接口和回调接口
[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秒钟推送一次:
[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服务
<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 实现如下:
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推送消息相关推荐
- 贾君鹏你妈妈喊你回家吃饭
贾君鹏你妈妈喊你回家吃饭原贴地址: http://tieba.baidu.com/f?ct=335544320&lm=0&rn=30&tn=postBrowserN&s ...
- 寂寞,你妈妈喊你回家吃饭——寂寞是一种罪
抵制寂寞!寂寞是一种罪! 最近流行一句话:贾君鹏,你妈妈喊你回家吃饭. 一时之间,天下之人,皆要回家吃饭 最近流行一个党:寂寞教当道 一时之间,哥吃的就不是面了,是寂寞 哥发的也不是帖了,是寂寞 哥浑 ...
- 【Spark你妈喊你回家吃饭-01】 Spark是什么鬼?
经过一段时间的学习和测试,是时候给spark的学习经历做一个总结了,对于spark的了解相对晚了写.春节期间(预计是无大事),本博准备推出20篇左右spark系列原创文章(先把牛吹出去再说) ,尽量将 ...
- html5利用websocket完成的推送功能(tomcat)
html5利用websocket完成的推送功能(tomcat) 利用websocket和java完成的消息推送功能,服务器用的是tomcat7.0.42,一些东西是自己琢磨的,也不知道恰不恰当,不恰当 ...
- 利用Comet4J 及时推送消息
简介 Comet4J是一个微型的即时推送框架,它分为服务端与客户端两部分,你只要将服务器端(JAR文件,目前仅支持Tomcat6.7)放入WEB-INF\lib,客户端(JavaScript文件)引入 ...
- 利用server酱推送消息和定时库:APScheduler
转载自公众号:python_shequ 最近工作比较繁杂,经常忘事,有时候记了备忘录结果却忘记看备忘录,但是微信是每天都会看的,于是就想到写一个基于微信的提醒系统.总体思路是将待办事项记录到在线记事本 ...
- 紧急提醒!黑客正利用假 ChatGPT 来推送恶意软件
黑客正在利用 ChatGPT 的火爆为 Windows 和 Android 分发恶意软件. 整理 | 禾木木 责编 | 梦依丹 出品 | CSDN(ID:CSDNnews) 自 ChatGP ...
- FTP微软喊你回家吃饭
现实生活中的信息安全一直不断验证那句俗语"春困夏乏秋无力,冬日正好眠",随着夏季的来临,昼长夜短,天气炎热,大洋彼岸的安全组织仍在昼伏夜出寻找"Exploit" ...
- 叶树:任总喊你回家吃饭 (zz)
2010年10月30日,看过当月的<华为人>报后,本人在某网站发了如下短文. //z 2012-08-23 18:00:59 IS2120@CSDN.T3412314858[T2,L56, ...
- Flutter 萌新高频问题(加班猿妈妈叫你回家吃饭了)
想写这个很久了,每个人都是从萌新来的,在一些国内Flutter群里(482462250,422833104)呆着, 经常有很多重复的问题在群里反复出现,导致群里大佬都不爱搭理了. 下面的目录会不断更新 ...
最新文章
- 【发现】Warcraft III v1.22 不用正版CDKey上Battle.net 续篇
- sap scc4 客户端设置
- python批量上传 服务器_Python Tornado批量上传图片并显示功能
- Restrictions查询用法
- php sqlite视图,SQLite 视图
- 开始开发HoloLens应用吧 Start Developing HoloLens Apps Today
- 内核中的TCP的追踪分析-9-TCP(IPV4)的socket的地址绑定--续2
- 网站常用组件收集整理
- 一个好用的用于前端的字体图标库
- Matlab画图程序
- 校园网接无线路由器多账号登录
- 超级好看的windows终端美化教程
- SAP Java Connector 错误 - JCO_ERROR_COMMUNICATION
- java减号的正则_java 正则匹配 特殊字符 减号- 的情况,处理方式
- tensorflow目标检测--识别赵丽颖
- lay-ui treeTable无限折叠
- anaconda中的pkgs文件清理
- 智能马桶盖松下好还是TOTO好?“资深”用户的对比贴来了
- python 发送匿名邮件或无发件人
- 【网盘项目日志】Seafile 源码部署和安装命令