Silverlight与WCF之间的通信(1)SL客户端定时请求WCF服务
这几天在做一个Silverlight的页面聊天工具,基本上从头看了一遍Silverlight和WCF相关的东西,也遇到了不少问题,刚开始是用Silverlight做了定时请求服务器的数据信息,后期准备利用WCF的双工通信来做,通信过程分为两个部分记录。
一 ,需要建立一个WCF的服务端
这里直接在Silverlight的站点中新建了一个WCF服务,代码如下:

//先定义服务契约
[ServiceContract]
public interface IChatService
{
[OperationContract]
bool SendMessage(MessageInfo msg);
[OperationContract]
List<MessageInfo> GetMessages(string UserAccount);
}
//再定义数据契约
[DataContract]
public class MessageInfo
{
[DataMember]
public string ID { set; get; }
[DataMember]
public string Title { set; get; }
[DataMember]
public string Message { set; get; }
[DataMember]
public DateTime SendTime { set; get; }
[DataMember]
public DateTime? ReadTime { set; get; }
[DataMember]
public string Sender { set; get; }
[DataMember]
public string ReceiveUser { set; get; }
[DataMember]
public string ReceiveOrgan { set; get; }
[DataMember]
public string ReceiveMode { set; get; }
[DataMember]
public int State { set; get; }
[DataMember]
public int Receipt { set; get; }
[DataMember]
public string Source { set; get; }
}
//最后在webconfig中配置好服务
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="ChatBehavior">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<service behaviorConfiguration="ChatBehavior" name="WebChat.Web.ChatService">
<endpoint address="" binding="basicHttpBinding" contract="WebChat.Web.IChatService"></endpoint>
</service>
</services>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
</system.serviceModel>
[ServiceContract]
public interface IChatService
{
[OperationContract]
bool SendMessage(MessageInfo msg);
[OperationContract]
List<MessageInfo> GetMessages(string UserAccount);
}
//再定义数据契约
[DataContract]
public class MessageInfo
{
[DataMember]
public string ID { set; get; }
[DataMember]
public string Title { set; get; }
[DataMember]
public string Message { set; get; }
[DataMember]
public DateTime SendTime { set; get; }
[DataMember]
public DateTime? ReadTime { set; get; }
[DataMember]
public string Sender { set; get; }
[DataMember]
public string ReceiveUser { set; get; }
[DataMember]
public string ReceiveOrgan { set; get; }
[DataMember]
public string ReceiveMode { set; get; }
[DataMember]
public int State { set; get; }
[DataMember]
public int Receipt { set; get; }
[DataMember]
public string Source { set; get; }
}
//最后在webconfig中配置好服务
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="ChatBehavior">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<service behaviorConfiguration="ChatBehavior" name="WebChat.Web.ChatService">
<endpoint address="" binding="basicHttpBinding" contract="WebChat.Web.IChatService"></endpoint>
</service>
</services>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
</system.serviceModel>
到这里呢,一个服务就Host在IIS上了,可以通过浏览服务或服务引用进行验证服务是否正常运行。
二,在Silverlight中向服务器请求数据

public partial class MainPage : UserControl
{
Timer timer;
ChatService.ChatServiceClient proxy;
BasicHttpBinding binding;
EndpointAddress endPoint;
public MainPage()
{
InitializeComponent();
binding = new BasicHttpBinding();
endPoint = new EndpointAddress("http://localhost:1939/ChatService.svc%22);
timer = new Timer(new TimerCallback(GetMessages),this,100,100);
}
#region 定时检测信息
public void GetMessages(object obj)
{
proxy = new ChatService.ChatServiceClient(binding, endPoint);
proxy.GetMessagesCompleted += new EventHandler<ChatService.GetMessagesCompletedEventArgs>(GetMessagesComleted);
proxy.GetMessagesAsync("wengyuli");
}
void GetMessagesComleted(object sender, ChatService.GetMessagesCompletedEventArgs e)
{
if(e.Error==null)
{
if (this.listMsgs.Dispatcher.CheckAccess())
{
this.listMsgs.ItemsSource= e.Result;
}
else
{
this.listMsgs.Dispatcher.BeginInvoke(() => { this.listMsgs.ItemsSource = e.Result; });
}
}
}
#endregion
#region 发送信息
private void btnSend_Click(object sender, RoutedEventArgs e)
{
ChatService.MessageInfo message = new ChatService.MessageInfo();
message.ID = Guid.NewGuid().ToString();
message.Receipt = 0;
message.ReceiveMode = "user";
message.ReceiveOrgan = "";
message.ReceiveUser = "xiejianjun";
message.Message = this.txtMessage.Text;
message.Sender = "wengyuli";
message.SendTime = DateTime.Now;
message.Source = "web";
message.State = 0;
message.Title = this.txtMessage.Text;
proxy = new ChatService.ChatServiceClient(binding, endPoint);
proxy.SendMessageCompleted += new EventHandler<ChatService.SendMessageCompletedEventArgs>(SendMessageComleted);
proxy.SendMessageAsync(message);
}
void SendMessageComleted(object sender,ChatService.SendMessageCompletedEventArgs e)
{
if (e.Error == null)
{
//MessageBox.Show("服务器返回结果:" + e.Result);
}
}
#endregion
}
{
Timer timer;
ChatService.ChatServiceClient proxy;
BasicHttpBinding binding;
EndpointAddress endPoint;
public MainPage()
{
InitializeComponent();
binding = new BasicHttpBinding();
endPoint = new EndpointAddress("http://localhost:1939/ChatService.svc%22);
timer = new Timer(new TimerCallback(GetMessages),this,100,100);
}
#region 定时检测信息
public void GetMessages(object obj)
{
proxy = new ChatService.ChatServiceClient(binding, endPoint);
proxy.GetMessagesCompleted += new EventHandler<ChatService.GetMessagesCompletedEventArgs>(GetMessagesComleted);
proxy.GetMessagesAsync("wengyuli");
}
void GetMessagesComleted(object sender, ChatService.GetMessagesCompletedEventArgs e)
{
if(e.Error==null)
{
if (this.listMsgs.Dispatcher.CheckAccess())
{
this.listMsgs.ItemsSource= e.Result;
}
else
{
this.listMsgs.Dispatcher.BeginInvoke(() => { this.listMsgs.ItemsSource = e.Result; });
}
}
}
#endregion
#region 发送信息
private void btnSend_Click(object sender, RoutedEventArgs e)
{
ChatService.MessageInfo message = new ChatService.MessageInfo();
message.ID = Guid.NewGuid().ToString();
message.Receipt = 0;
message.ReceiveMode = "user";
message.ReceiveOrgan = "";
message.ReceiveUser = "xiejianjun";
message.Message = this.txtMessage.Text;
message.Sender = "wengyuli";
message.SendTime = DateTime.Now;
message.Source = "web";
message.State = 0;
message.Title = this.txtMessage.Text;
proxy = new ChatService.ChatServiceClient(binding, endPoint);
proxy.SendMessageCompleted += new EventHandler<ChatService.SendMessageCompletedEventArgs>(SendMessageComleted);
proxy.SendMessageAsync(message);
}
void SendMessageComleted(object sender,ChatService.SendMessageCompletedEventArgs e)
{
if (e.Error == null)
{
//MessageBox.Show("服务器返回结果:" + e.Result);
}
}
#endregion
}
前台:
<ListBox Height="213" HorizontalAlignment="Left" DisplayMemberPath="Message" ItemsSource="{Binding MessageInfo}" Name="listMsgs" VerticalAlignment="Top" Width="283" ></ListBox>
编译并运行后得到数据:
分类:
Silverlight
, WCF编程
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述