有点标题党了,最近因工作需要,想利用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 ; }
}
public class MessageEntity
{
[DataMember]
public string Content { get ; set ; }
}
基本原理是消息发送的页面将要发送的消息列表保存在全局缓存中,在WCF服务中取得要发送的消息推送
到Winform端,SendMessage.aspx的代码如下:
Code
ISendMessageService.cs 用来定义消息接收接口和回调接口
Code
SendMessageService.svc.cs 用来实现将缓存中的消息列表一个一个的推送出去,采用Timer类每2-5秒钟推送一次:
Code , Timeout.Infinite);
}
#endregion
private void heartTimer_Elapsed(object data)
{
List<MessageEntity> messageList = httpruntime.cache["MessageEntityList"] as List<MessageEntity>;
if (messageList != null && messageList.Count > @H_708_404@0)
{
MessageEntity message = messageList[@H_708_404@0];
messageList.Remove(message);
httpruntime.cache["MessageEntityList"] = messageList;
callback.ReceiveMessage(message);
}
int interval = random.Next(@H_708_404@2000, @H_708_404@5000);
heartTimer.Change(interval, Timeout.Infinite);
}
}
记得修改Web.Config中EndPoint Binding 为wsDualHttpBinding ,这样才支持Duplex服务
Code
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 - @H_708_404@1;
}
#region ISendMessageServiceCallback 成员
public void ReceiveMessage(MessageEntity messageEntity)
{
if (true == listbMessage.Invokerequired)
{
listbMessage.Invoke(new UpdateListBoxDelegate(UpdateListBox), messageEntity.Content);
}
else
{
UpdateListBox(messageEntity.Content);
}
}
#endregion }
@H_502_847@
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。