wcf全面解析proj1企業(yè)內部交流平臺.ppt
《wcf全面解析proj1企業(yè)內部交流平臺.ppt》由會員分享,可在線閱讀,更多相關《wcf全面解析proj1企業(yè)內部交流平臺.ppt(38頁珍藏版)》請在裝配圖網(wǎng)上搜索。
BF-TECH 4.0 DNET 軟件開發(fā)工程師高薪就業(yè)品牌課程 版權所有:北風網(wǎng),使用WCF搭建企業(yè)通用架構 講師:石曼迪,項目案例1:企業(yè)內部交流平臺,目錄,內部交流平臺需求 內部交流平臺技術選型 內部交流平臺設計 內部交流平臺實現(xiàn) 內部交流平臺演示 內部交流平臺項目總結,目標,熟悉WCF開發(fā) 了解WPF開發(fā) 了解通信原理,項目成果展示,,項目成果展示,,內部交流平臺背景,衡量溝通效果的四個指標:方便性、及時性、有效性、可追溯性。先看一下我們對各種溝通方式的對比分析: 面對面溝通; 電話溝通; Email電子郵件; IM即時通訊;,內部交流平臺背景,我們需要溝通…… 我們能實現(xiàn)及時溝通……,內部交流平臺技術選型,,內部交流平臺技術選型,套接字編程? 不要 復雜的配置? 不要 開發(fā)成本高? 不要 維護性能差? 不要 平臺兼容性不好? 不要 擴展性差? 不要 協(xié)議單一? 不要 那我們要啥? WCF能夠滿足這些要求!,內部交流平臺設計,采用WCF服務端+客戶端方式; 通過TCP/IP通信協(xié)議; 采用WPF界面開發(fā)(設備無關性); 采用ServiceThrottlingBehavior高性能配置建議;,內部交流平臺實現(xiàn):服務端,采用HTTP和TCP/IP兩種協(xié)議進行通訊 采用WPF應用程序作為宿主 端口IP自配置,內部交流平臺實現(xiàn):服務端,類圖,內部交流平臺實現(xiàn):服務端,類圖,內部交流平臺實現(xiàn):服務端,界面實現(xiàn),Local IP: Listen Port: Stop Start Status Chat Service,內部交流平臺實現(xiàn):服務端,引用程序集,內部交流平臺實現(xiàn):服務端,定義一個服務: 設置文件傳輸參數(shù),Uri httpAdrs = new Uri(“http://“ + textBoxIP.Text.ToString() + “:“ + (int.Parse(textBoxPort.Text.ToString()) + 1).ToString() + “/WPFHost/“); Uri[] baseAdresses = { tcpAdrs, httpAdrs }; host = new ServiceHost(typeof(ServiceAssembly.ChatService), baseAdresses);,NetTcpBinding tcpBinding = new NetTcpBinding(SecurityMode.None, true); //設置文件傳輸最大為 64 MB tcpBinding.MaxBufferPoolSize = (int)67108864; tcpBinding.MaxBufferSize = 67108864; tcpBinding.MaxReceivedMessageSize = (int)67108864; tcpBinding.TransferMode = TransferMode.Buffered; tcpBinding.ReaderQuotas.MaxArrayLength = 67108864; tcpBinding.ReaderQuotas.MaxBytesPerRead = 67108864; tcpBinding.ReaderQuotas.MaxStringContentLength = 67108864;,內部交流平臺實現(xiàn):服務端,打開優(yōu)化配置: 設置保持連接,ServiceThrottlingBehavior throttle; throttle = host.Description.Behaviors.Find(); if (throttle == null) { throttle = new ServiceThrottlingBehavior(); throttle.MaxConcurrentCalls = 100; throttle.MaxConcurrentSessions = 100; host.Description.Behaviors.Add(throttle); },//保持連接 20 hours. tcpBinding.ReceiveTimeout = new TimeSpan(20, 0, 0); tcpBinding.ReliableSession.Enabled = true; tcpBinding.ReliableSession.InactivityTimeout = new TimeSpan(20, 0, 10); host.AddServiceEndpoint(typeof(ServiceAssembly.IChat), tcpBinding, “tcp“);,內部交流平臺實現(xiàn):服務端,開啟服務:,try { host.Open(); } catch (Exception ex) { labelStatus.Content = ex.Message.ToString(); } finally { if (host.State == CommunicationState.Opened) { labelStatus.Content = “Opened“; buttonStop.IsEnabled = true;,內部交流平臺實現(xiàn):服務端,測試服務:,http://localhost:7998/WPFHost/,內部交流平臺實現(xiàn):服務端,配置文件:,,內部交流平臺實現(xiàn):客戶端,采用WPF應用程序作為客戶端表現(xiàn): 增加頭像和文件傳輸,內部交流平臺實現(xiàn):客戶端,增加服務引用 net.tcp://localhost:7996/WPFHost/mex,內部交流平臺實現(xiàn):客戶端,界面實現(xiàn):,,內部交流平臺實現(xiàn):客戶端,定義事件: 定義客戶端集合,this.Loaded += new RoutedEventHandler(Window1_Loaded); chatListBoxNames.SelectionChanged += new SelectionChangedEventHandler(chatListBoxNames_SelectionChanged); chatTxtBoxType.KeyDown += new KeyEventHandler(chatTxtBoxType_KeyDown); chatTxtBoxType.KeyUp += new KeyEventHandler(chatTxtBoxType_KeyUp);,Dictionary OnlineClients = new Dictionary();,內部交流平臺實現(xiàn):客戶端,定義狀態(tài)判斷:,if (proxy != null) { switch (this.proxy.State) { case CommunicationState.Closed: proxy = null; loginButtonConnect.IsEnabled = true; break; case CommunicationState.Closing: break; case CommunicationState.Created: break; case CommunicationState.Faulted: proxy.Abort(); break; case CommunicationState.Opened: ShowLogin(false); break; case CommunicationState.Opening: break;,內部交流平臺實現(xiàn):客戶端,建立客戶端連接:,string servicePath = . proxy.Endpoint.Address = . proxy.Open(); proxy.InnerDuplexChannel.Faulted += new EventHandler(InnerDuplexChannel_Faulted); proxy.InnerDuplexChannel.Opened += new EventHandler(InnerDuplexChannel_Opened); proxy.InnerDuplexChannel.Closed += new EventHandler(InnerDuplexChannel_Closed); proxy.ConnectAsync(this.localClient); proxy.ConnectCompleted += new EventHandler(proxy_ConnectCompleted);,內部交流平臺實現(xiàn):客戶端,消息發(fā)送:,if ((bool)chatCheckBoxWhisper.IsChecked) { if (this.receiver != null) { proxy.WhisperAsync(msg, this.receiver); chatTxtBoxType.Text = ““; chatTxtBoxType.Focus(); } } else { proxy.SayAsync(msg); chatTxtBoxType.Text = ““; },內部交流平臺實現(xiàn):客戶端,添加頭像:,Dictionary images = new Dictionary(); int i = 0; foreach (Stream strm in picsStrm) { PngBitmapDecoder decoder = new PngBitmapDecoder(strm, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default); BitmapSource bitmap = decoder.Frames[0] as BitmapSource; Image img = new Image(); img.Source = bitmap; img.Stretch = Stretch.UniformToFill; images.Add(i, img); i++; strm.Close(); } return images;,內部交流平臺實現(xiàn):客戶端,文件發(fā)送:,OpenFileDialog fileDialog = new OpenFileDialog(); fileDialog.Multiselect = false; strm = fileDialog.OpenFile(); if (strm != null) { byte[] buffer = new byte[(int)strm.Length]; int i = strm.Read(buffer, 0, buffer.Length); if (i 0) { SVC.FileMessage fMsg = new FileMessage(); fMsg.FileName = fileDialog.SafeFileName; fMsg.Sender = this.localClient.Name; fMsg.Data = buffer; proxy.SendFileAsync(fMsg, this.receiver); proxy.SendFileCompleted += new EventHandler(proxy_SendFileCompleted); chatLabelSendFileStatus.Content = “Sending.“; } },內部交流平臺實現(xiàn):客戶端,文件接收:,try { FileStream fileStrm = new FileStream(rcvFilesPath + fileMsg.FileName, FileMode.Create, FileAccess.ReadWrite); fileStrm.Write(fileMsg.Data, 0, fileMsg.Data.Length); chatLabelSendFileStatus.Content = “Received file, “ + fileMsg.FileName; } catch (Exception ex) { chatLabelSendFileStatus.Content = ex.Message.ToString(); },內部交流平臺實現(xiàn):客戶端,用戶登錄和注銷:,public void UserJoin(WPFClient.SVC.Client client) { ListBoxItem item = MakeItem(client.AvatarID, “------------ “ + client.Name + “ joined chat ------------“); chatListBoxMsgs.Items.Add(item); ScrollViewer sv = FindVisualChild(chatListBoxMsgs); sv.LineDown(); },public void UserLeave(WPFClient.SVC.Client client) { ListBoxItem item = MakeItem(client.AvatarID, “------------ “ + client.Name + “ left chat ------------“); chatListBoxMsgs.Items.Add(item); ScrollViewer sv = FindVisualChild(chatListBoxMsgs); sv.LineDown(); },內部交流平臺實現(xiàn):客戶端,配置文件:,,,內部交流平臺演示,,內部交流平臺項目總結,為什么要使用 net.tcp 綁定 為了更好地實現(xiàn)雙向通信,.NET Framework在 3.0的時候引入了一個全新 的通信協(xié)議Net.TCP并作為WCF的一部分。它極大地改進了吞吐量 和連接的數(shù)量。 WCF服務寄宿方式 WCF服務寄宿方式:通過自我寄宿的方式寄宿服務和通過IIS寄宿服務服務寄宿的目的就是開啟一個進程,為WCF服務提供一個運行的環(huán)境。通過為服務添加一個或多個終結點,使之暴露給潛給的服務消費者。服務消費者最終通過相匹配的終結點對該服務進行調用。,總結,WCF通信技術 WPF開發(fā)技術 WCF通信優(yōu)化技術,WCF視頻教程:使用WCF搭建企業(yè)通用架構 學習地址:,歡迎訪問我們的官方網(wǎng)站 ,- 配套講稿:
如PPT文件的首頁顯示word圖標,表示該PPT已包含配套word講稿。雙擊word圖標可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國旗、國徽等圖片,僅作為作品整體效果示例展示,禁止商用。設計者僅對作品中獨創(chuàng)性部分享有著作權。
- 關 鍵 詞:
- wcf 全面 解析 proj1 企業(yè)內部 交流平臺
裝配圖網(wǎng)所有資源均是用戶自行上傳分享,僅供網(wǎng)友學習交流,未經(jīng)上傳用戶書面授權,請勿作他用。
鏈接地址:http://appdesigncorp.com/p-2721104.html