这是来公司做的第二个项目实例。最近在学习WCF方面的知识,看了一些资料,于是做了这个可以实现聊天功能的项目实例。
新建WCF服务和Silverlight项目就不说了主要来看代码:
WCF服务契约与数据契约:
<span style="color:#FF0000;"> [ServiceContract(CallbackContract = typeof(IMessageCallBack))]</span> public interface IMessageManage { [OperationContract] bool SendMessage(MessageInfo msg); [OperationContract] bool RequestMessage(UserInfo user); [OperationContract] List<UserInfo> GetUserInfo(); [OperationContract] bool createuser(UserInfo user); } public interface IMessageCallBack { <span style="color:#FF0000;"> [OperationContract(IsOneWay = true)] void GetMessage(MessageInfo message);</span> } <pre name="code" class="csharp"><span style="color:#FF0000;">[DataContract]</span>public class MessageInfo { [DataMember] public UserInfo FromUser { get; set; } [DataMember] public UserInfo ToUser { get; set; } [DataMember] public string Content { get; set; } [DataMember] public DateTime SendTime { get; set; } }[DataContract] public class UserInfo { [DataMember] public int Id { get; set; } [DataMember] public string Name { get; set; } } WCF的实现:
using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; using System.ServiceModel; using System.Text; <span style="background-color: rgb(255,0);">using WcfModel;</span> namespace WcfService { public class MessageService : IMessageManage { private static Dictionary<int,IMessageCallBack> DicCallChannel = new Dictionary<int,IMessageCallBack>(); public static List<UserInfo> getuserTemp = new List<UserInfo>(); private int UserId = 0; public bool createuser(UserInfo user) { if (getuserTemp == null) getuserTemp = new List<UserInfo>(); bool r = false; foreach (UserInfo list in getuserTemp) { if (list.Id.Equals(user.Id)) { r = true; } } if (r) { return false; } getuserTemp.Add(user); return true; } public bool SendMessage(MessageInfo msg) { if (DicCallChannel.Keys.Contains(msg.ToUser.Id)) { DicCallChannel[msg.ToUser.Id].GetMessage(msg); return true; } return false; } public bool RequestMessage(UserInfo user) { IMessageCallBack channel = OperationContext.Current.GetCallbackChannel<IMessageCallBack>(); if (!DicCallChannel.Keys.Contains(user.Id)) { DicCallChannel.Add(user.Id,channel); UserId = user.Id; OperationContext.Current.Channel.Closing += Channel_Closing; } return true; } void Channel_Closing(object sender,EventArgs e) { if (DicCallChannel.Keys.Contains(UserId)) { DicCallChannel.Remove(UserId); } } public List<UserInfo> GetUserInfo() { return getuserTemp; } } }MainPage前台代码:
<UserControl x:Class="SilverlightApplication.MainPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" d:DesignHeight="600" d:DesignWidth="800" xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk" xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation"> <ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto" > <Grid x:Name="LayoutRoot" Background="White" ScrollViewer.HorizontalScrollBarVisibility="Auto" ScrollViewer.VerticalScrollBarVisibility="Auto" Height="700"> <StackPanel Orientation="Vertical" VerticalAlignment="Center" HorizontalAlignment="Center" ScrollViewer.HorizontalScrollBarVisibility="Auto" ScrollViewer.VerticalScrollBarVisibility="Auto" Height="456" Margin="286,92,259,152" Width="228"> <!--<Button x:Name="btncreateuser1" Content="Create User1" Width="100" Margin="0,10,0" Click="btncreateuser1_Click" /> <Button x:Name="btncreateuser2" Content="Create User2" Width="100" Margin="0,0" Click="btncreateuser2_Click" />--> <telerik:GroupBox Height="300" Name="groupBox2" Width="200" Header="收"> <TextBox x:Name="txtContentRecord" Width="182" Height="261" IsReadOnly="True" Margin="0,0" textwrapping="Wrap" /> </telerik:GroupBox> <telerik:GroupBox Height="107" Name="groupBox3" Width="200" Header="发" Margin="0,30,0"> <StackPanel> <TextBox x:Name="txtContent" Width="182" Height="30" Margin="0,0" AllowDrop="False" AcceptsReturn="True" textwrapping="Wrap" /> <Button x:Name="btnSend" Content="Send" Width="100" Margin="0,0" Click="btnSend_Click"> </Button> </StackPanel> </telerik:GroupBox> </StackPanel> <StackPanel Margin="27,514,152"> <!--<ListBox Width="100" Height="60" x:Name="lstgu" ></ListBox>--> <!--<TextBox x:Name="txtGU" Width="100" Height="100"></TextBox>--> <StackPanel Orientation="Horizontal" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="0,0" Width="202" Height="209"> <telerik:GroupBox Height="180" Name="groupBox4" Width="118" Header="User List" Margin="10,0"> <sdk:DataGrid DataContext="{Binding}" AutoGenerateColumns="False" Height="125" Name="dataGrid1" Width="89" Margin="0,0" SelectionChanged="dataGrid1_SelectionChanged" IsReadOnly="True"> <sdk:DataGrid.Columns> <sdk:DataGridTextColumn CanUserReorder="True" CanUserResize="True" CanUserSort="True" Header="Id" Width="Auto" Binding="{Binding Id}" /> <sdk:DataGridTextColumn CanUserReorder="True" CanUserResize="True" CanUserSort="True" Header="Name" Width="Auto" Binding="{Binding Name}" /> </sdk:DataGrid.Columns> </sdk:DataGrid> </telerik:GroupBox> <Button x:Name="btnRefreshUser" Click="btnRefreshUser_Click" Width="63" Height="20" Margin="10,0" IsEnabled="False">Refresh</Button> </StackPanel> <telerik:GroupBox Height="116" Name="groupBox1" Width="202" Header="User Login"> <StackPanel> <StackPanel Orientation="Horizontal" VerticalAlignment="Center" HorizontalAlignment="Center" Margin="0,0"> <TextBlock TextAlignment="Center" VerticalAlignment="Center">Id:</TextBlock> <TextBox x:Name="CurrentId" Width="60" Margin="21,0" ></TextBox> </StackPanel> <StackPanel Orientation="Horizontal" HorizontalAlignment="Center" VerticalAlignment="Center"> <TextBlock TextAlignment="Center" VerticalAlignment="Center">Name:</TextBlock> <TextBox x:Name="CurrentName" Width="60" ></TextBox> </StackPanel> <StackPanel x:Name="login"> <Button x:Name="Login" Click="Login_Click" Width="95" Margin="0,0">Login</Button> </StackPanel> </StackPanel> </telerik:GroupBox> <!--<telerik:GroupBox Height="134" Name="groupBox5" Width="202" Header="Create User"> <StackPanel> <StackPanel Orientation="Horizontal" VerticalAlignment="Center" HorizontalAlignment="Center" Margin="0,0"> <TextBlock TextAlignment="Center" VerticalAlignment="Center">Id:</TextBlock> <TextBox x:Name="createuserId" Width="60" Margin="21,0"></TextBox> </StackPanel> <StackPanel Orientation="Horizontal" HorizontalAlignment="Center" VerticalAlignment="Center"> <TextBlock TextAlignment="Center" VerticalAlignment="Center">Name:</TextBlock> <TextBox x:Name="createuserName" Width="60"></TextBox> </StackPanel> <StackPanel Orientation="Horizontal" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="0,0"> <Button x:Name="btncreateuser" Click="btncreateuser_Click">createuser</Button> </StackPanel> </StackPanel> </telerik:GroupBox>--> </StackPanel> </Grid> </ScrollViewer> </UserControl>MainPage后台代码:
using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Windows; using System.Windows.Controls; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Animation; using System.Windows.Shapes; using SilverlightApplication.MessageService; using System.ComponentModel; using System.Collections.ObjectModel; namespace SilverlightApplication { public partial class MainPage : UserControl { MessageInfo message = new MessageInfo(); public List<UserInfo> listuser = new List<UserInfo>(); //string p; //string p_2; //string p_3; //bool refresh = false; public MainPage() { InitializeComponent(); getlistuser(); //UserInfo rtouser = new UserInfo(); //rtouser.Id=Convert.ToInt32(this.CurrentId.Text); //rtouser.Name = this.CurrentName.Text; } //public MainPage(string p,string p_2,string p_3) //{ // InitializeComponent(); // this.p = p; // this.p_2 = p_2; // this.CurrentId.Text = p; // this.CurrentName.Text = p_2; // this.txtContentRecord.Text = p_3; // rgetlistuser(); // this.CurrentId.IsReadOnly = true; // this.CurrentName.IsReadOnly = true; // this.login.Visibility = Visibility.Collapsed; //} public void getlistuser() { MessageManageClient client = new MessageManageClient(); client.GetUserInfoCompleted += new EventHandler<GetUserInfoCompletedEventArgs>(client_GetUserInfoCompleted); client.GetUserInfoAsync(); } void client_GetUserInfoCompleted(object sender,GetUserInfoCompletedEventArgs e) { if (e.Result != null) { foreach (var list in e.Result) { listuser.Add(list); } //this.dataGrid1.ItemsSource = listuser; } else { MessageBox.Show("当前用户列表为空!"); } } //public void rgetlistuser() //{ // ChatServiceClient client = new ChatServiceClient(); // client.GetUserInfoCompleted += new EventHandler<GetUserInfoCompletedEventArgs>(client_GetUserInfoCompletedR); // client.GetUserInfoAsync(); //} //void client_GetUserInfoCompletedR(object sender,GetUserInfoCompletedEventArgs e) //{ // listuser.Clear(); // if (e.Result != null) // { // foreach (var list in e.Result) // { // listuser.Add(list); // } // this.dataGrid1.ItemsSource = listuser; // } // else // { // MessageBox.Show("当前用户列表为空!"); // } //} //private ObservableCollection<UserInfo> _listuser = null; //private void btncreateuser1_Click(object sender,RoutedEventArgs e) //{ // this.btncreateuser2.IsEnabled = false; // ChatServiceClient client = new ChatServiceClient(); // UserInfo formUser = new UserInfo() // { // Id = 123,// Name = "张三" // }; // //creatuser1 = formUser; // //getuser.Add(formUser); // UserInfo toUser = new UserInfo() // { // Id = 234,// Name = "李四",// }; // message.FromUser = formUser; // message.ToUser = toUser; // message.Content = txtContent.Text; // message.SendTime = DateTime.Now; // client.RequestMessageCompleted += new EventHandler<RequestMessageCompletedEventArgs>(client_RequestMessageCompleted); // client.RequestMessageAsync(formUser); // //client.GetUserInfoAsync(formUser); // client.GetMessageReceived += new EventHandler<GetMessageReceivedEventArgs>(client_GetMessageReceived); // //client.RequestMessageCompleted += (rs,re) => // //{ // // if (re.Result) // // { // // MessageBox.Show("用户" + formUser.Id + "创建成功!"); // // } // //}; // //client.GetMessageReceived += (gs,ge) => // //{ // // if (ge.Error == null) // // { // // txtContentRecord.Text += "\r" + "来自:" + ge.message.FromUser.Name + ",内容:" + ge.message.Content + ",时间:" + ge.message.SendTime.ToShortTimeString(); // // } // //}; //} //void client_RequestMessageCompleted(object sender,RequestMessageCompletedEventArgs e) //{ // if (e.Result) // { // MessageBox.Show("通道创建成功!"); // } //} //void client_GetMessageReceived(object sender,GetMessageReceivedEventArgs e) //{ // if (e.Error == null) // { // //txtContentRecord.Text +="\r\n"+ "来自:" + e.message.FromUser.Name + ",内容:" + e.message.Content + ",时间:" + e.message.SendTime.ToShortTimeString()+"\r\n"; // if (this.txtContentRecord.Text == "") // { // txtContentRecord.Text +=e.message.FromUser.Name + e.message.SendTime.ToShortTimeString() + ":"+"\r\n" + e.message.Content ; // } // else // { // txtContentRecord.Text += "\r\n" + e.message.FromUser.Name + e.message.SendTime.ToShortTimeString() + ":" + "\r\n" + e.message.Content; // } // } //} //private void btncreateuser2_Click(object sender,RoutedEventArgs e) //{ // this.btncreateuser1.IsEnabled = false; // ChatServiceClient client = new ChatServiceClient(); // UserInfo formUser = new UserInfo() // { // Id = 234,// Name = "李四" // }; // //creatuser2 = formUser; // //getuser.Add(formUser); // UserInfo toUser = new UserInfo() // { // Id = 123,// Name = "张三",// }; // message.FromUser = formUser; // message.ToUser = toUser; // message.Content = txtContent.Text; // message.SendTime = DateTime.Now; // client.RequestMessageCompleted += new EventHandler<RequestMessageCompletedEventArgs>(client_RequestMessageCompleted1); // client.RequestMessageAsync(formUser); // client.GetMessageReceived += new EventHandler<GetMessageReceivedEventArgs>(client_GetMessageReceived1); // //client.GetUserInfoAsync(formUser); // //client.RequestMessageCompleted += (rs,时间:" + ge.message.SendTime.ToShortTimeString(); // // } // //}; //} private void btnSend_Click(object sender,RoutedEventArgs e) { if (this.txtContent.Text == "" || this.dataGrid1.SelectedItem == null) { MessageBox.Show("消息内容为空或没有选择聊天对象!"); } else { MessageManageClient client = new MessageManageClient(); message.Content = txtContent.Text; message.SendTime = DateTime.Now; client.SendMessageCompleted += new EventHandler<SendMessageCompletedEventArgs>(client_SendMessageCompleted); client.SendMessageAsync(message); //client.SendMessageCompleted += (ds,de) => //{ // if (de.Result) // { // MessageBox.Show("发送成功!"); // } // else // { // MessageBox.Show("发送失败!"); // } //}; } } void client_SendMessageCompleted(object sender,SendMessageCompletedEventArgs e) { if (e.Result) { if (this.txtContentRecord.Text == "") { this.txtContentRecord.Text += this.CurrentName.Text + DateTime.Now.ToShortTimeString() + ":" + " \r\n" + this.txtContent.Text; this.txtContent.Text = ""; MessageBox.Show("发送成功!"); } else { this.txtContentRecord.Text += "\r\n" + this.CurrentName.Text + DateTime.Now.ToShortTimeString() + ":" + " \r\n" + this.txtContent.Text; this.txtContent.Text = ""; MessageBox.Show("发送成功!"); } } else { MessageBox.Show("发送失败!"); this.txtContent.Text = ""; } } //private void btnGU_Click(object sender,RoutedEventArgs e) //{ // ChatServiceClient client = new ChatServiceClient(); // client.GetUserInfoCompleted += new EventHandler<GetUserInfoCompletedEventArgs>(client_GetUserInfoCompleted); // client.GetUserInfoAsync(); // int i; // for (i = 0; i < getuser.Count; i++) // { // client.GetUserInfoAsync(getuser[i]); // } //} //private void btnGU_Click(object sender,RoutedEventArgs e) //{ // MessageManageClient client = new MessageManageClient(); // client.GetUserInfoCompleted += new EventHandler<GetUserInfoCompletedEventArgs>(client_GetUserInfoCompleted); // client.GetUserInfoAsync(); //} //void client_GetUserInfoCompleted(object sender,GetUserInfoCompletedEventArgs e) //{ // //this.lstgu.ItemsSource = e.Result; // this.dataGrid1.ItemsSource = e.Result; // //List<UserInfo> list=new List<UserInfo>(); // //list = e.Result; // //this.lstgu.Items.Add( // // new TextBlock // //{ // // Text = "用户名:",// // textwrapping = textwrapping.Wrap // //} // //); //UserInfo abc=new UserInfo(); //abc = e.Result; //if (this.txtGU.Text == "") //{ // this.txtGU.Text += "Id:" + e.Result.Id + "\r\n" + "Name:" + e.Result.Name; //} //else //{ // this.txtGU.Text += "\r\n" + "Id:" + e.Result.Id + "\r\n" + "Name:" + e.Result.Name; //} //} //private void btncreateuser_Click(object sender,RoutedEventArgs e) //{ // UserInfo create = new UserInfo(); // create.Id = Convert.ToInt32(this.createuserId.Text); // create.Name = this.createuserName.Text; // ChatServiceClient client = new ChatServiceClient(); // client.createuserCompleted += new EventHandler<createuserCompletedEventArgs>(client_createuserCompleted); // client.createuserAsync(create); // client.GetUserInfoCompleted += new EventHandler<GetUserInfoCompletedEventArgs>(client_GetUserInfoCompleted); // client.GetUserInfoAsync(); // App app = (App)Application.Current; // app.RedirectTo(new MainPage()); //} //void client_createuserCompleted(object sender,createuserCompletedEventArgs e) //{ // if (e.Result!=null) // { // MessageBox.Show("用户创建成功!"); // //_listuser = e.Result; // //this.dataGrid1.ItemsSource = e.Result; // this.createuserId.Text = ""; // this.createuserName.Text = ""; // this.groupBox1.Visibility = Visibility.Visible; // this.CurrentId.Text = Convert.ToString(e.Result.Id); // this.CurrentName.Text = e.Result.Name; // this.groupBox5.Visibility = Visibility.Collapsed; // //lstgu.Items.Add // // ( // // new TextBlock // // { // // Text = "Id:" + e.Result.Id+"\n"+ "Name:" + e.Result.Name,// // textwrapping = textwrapping.Wrap // // } // // ); // } // else // { // MessageBox.Show("用户创建失败!"); // } //} //private void btnGU_Click(object sender,RoutedEventArgs e) //{ // ChatServiceClient client = new ChatServiceClient(); // client.GetUserInfoCompleted += new EventHandler<GetUserInfoCompletedEventArgs>(client_GetUserInfoCompleted); // client.GetUserInfoAsync(); //} private void dataGrid1_SelectionChanged(object sender,SelectionChangedEventArgs e) { UserInfo stouser = new UserInfo(); stouser = (UserInfo)this.dataGrid1.SelectedItem; if (this.dataGrid1.SelectedItem == null) { tongxin(); } else { MessageManageClient client = new MessageManageClient(); UserInfo formUser = new UserInfo() { Id = Convert.ToInt32(this.CurrentId.Text),Name = this.CurrentName.Text,}; UserInfo toUser = new UserInfo() { Id = stouser.Id,Name = stouser.Name,}; message.FromUser = formUser; message.ToUser = toUser; message.Content = txtContent.Text; message.SendTime = DateTime.Now; client.RequestMessageCompleted += new EventHandler<RequestMessageCompletedEventArgs>(client_RequestMessageCompleted); client.RequestMessageAsync(formUser); client.GetMessageReceived += new EventHandler<GetMessageReceivedEventArgs>(client_GetMessageReceived); } } void client_RequestMessageCompleted(object sender,RequestMessageCompletedEventArgs e) { if (e.Result) { MessageBox.Show("当前用户通信通道创建成功!"); } } void client_GetMessageReceived(object sender,GetMessageReceivedEventArgs e) { if (e.Error == null) { //txtContentRecord.Text += "\r\n"+"来自:" + e.message.FromUser.Name + ",时间:" + e.message.SendTime.ToShortTimeString()+"\r\n"; if (this.txtContentRecord.Text == "") { txtContentRecord.Text += e.message.FromUser.Name + e.message.SendTime.ToShortTimeString() + ":" + "\r\n" + e.message.Content; } else { txtContentRecord.Text += "\r\n" + e.message.FromUser.Name + e.message.SendTime.ToShortTimeString() + ":" + "\r\n" + e.message.Content; } } } private void Login_Click(object sender,RoutedEventArgs e) { if (this.CurrentId.Text == "" || this.CurrentName.Text == "") { MessageBox.Show("Id或Name不能为空!"); } else { UserInfo currentuser = new UserInfo(); currentuser.Id = Convert.ToInt32(this.CurrentId.Text); currentuser.Name = this.CurrentName.Text; bool isSuccess = false; foreach (UserInfo u in listuser) { if (u.Id.Equals(currentuser.Id) && u.Name.Equals(currentuser.Name)) { isSuccess = true; } } if (isSuccess) { MessageBox.Show("用户" + currentuser.Name + "登录成功!"); this.btnRefreshUser.IsEnabled = true; this.dataGrid1.ItemsSource = listuser; this.CurrentId.IsReadOnly = true; this.CurrentName.IsReadOnly = true; this.login.Visibility = Visibility.Collapsed; tongxin(); } else { MessageBox.Show("用户" + currentuser.Name + "登录失败!"); } } } private void btnRefreshUser_Click(object sender,RoutedEventArgs e) { //App app = (App)Application.Current; //app.RedirectTo(new MainPage(this.CurrentId.Text.Trim(),this.CurrentName.Text.Trim(),this.txtContentRecord.Text.Trim())); //this.dataGrid1.ItemsSource = null; //refresh = true; MessageManageClient client = new MessageManageClient(); client.GetUserInfoCompleted += new EventHandler<GetUserInfoCompletedEventArgs>(client_GetUserInfoCompleted12); client.GetUserInfoAsync(); } void client_GetUserInfoCompleted12(object sender,GetUserInfoCompletedEventArgs e) { if (e.Result != null) { List<UserInfo> rlistuser = new List<UserInfo>(); foreach (var list in e.Result) { rlistuser.Add(list); } this.dataGrid1.ItemsSource = rlistuser; } else { MessageBox.Show("当前用户列表为空!"); } } public void tongxin() { MessageManageClient client = new MessageManageClient(); UserInfo formUser = new UserInfo() { Id = Convert.ToInt32(this.CurrentId.Text),}; UserInfo toUser = new UserInfo() { Id = formUser.Id,Name = formUser.Name,}; message.FromUser = formUser; message.ToUser = toUser; message.Content = txtContent.Text; message.SendTime = DateTime.Now; client.RequestMessageCompleted += new EventHandler<RequestMessageCompletedEventArgs>(client_RequestMessageCompleted123); client.RequestMessageAsync(formUser); client.GetMessageReceived += new EventHandler<GetMessageReceivedEventArgs>(client_GetMessageReceived); } void client_RequestMessageCompleted123(object sender,RequestMessageCompletedEventArgs e) { if (e.Result) { //MessageBox.Show("当前用户通信通道创建成功!"); } } } }
本实例的一些配置主要参照了下文:
http://blog.csdn.net/cyb331/article/details/9185801
感谢该博主。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。