前言
最近接一個SL項目,由於SL本身是一個基於.net framework 但是又獨立於.net framework的內核,它有諸多局限性並沒有.net framework如此強大,例如那些經常做WinForm開發的猿猿們肯定很難受,熟悉的DataTable沒了,熟悉的IAsyncResult接口沒了,憋啊~。因此在SL環境中WCF 通信就變得很重要了。注意,也許你已接觸了WCF RIA Service 但是本次我們不討論這個,這個多少數基於SQL SERVER + EF4 來做,有興趣的可以去園子里找相關博文,一大把。
由於WCF是一個很大的主題,同時本文不是講解WCF的,所以在讀本文時需要您有一定的WCF基礎,沒有的就去拜讀一下Artech大佬的WCF系列文章吧。同時要注意了,目前只有SL4以上的版本支持NET.TCP協議,所以請注意您當前的SL版本。
建立項目
打開您的VS2010
1.建立一個空白解決方案
2.建立一個WCF Service Application 服務
3.建立一個SL客戶端,注意建立的時候千萬不要勾選Enable RIA Service
4.建立好后順手Build一下的您解決方案吧
例如下圖
配置服務
為了更直接的說明如何配置,這里我們就不重新設計服務了,就用項目建立默認的IService1吧,那么我們接下來講講如何配置服務的。
1.首先打開的你的一些功能服務,本人用的是WIN7,因此需要在控制面板->程序->打開或關閉Windows功能里找到如下選項
選中后點擊確定,完成后你會做服務里找到如下一些已啟動的服務,如圖
2.完成如上配置后,那么下一步我們是修改解決方案里服務端依賴的IIS,由VS字段的IIS改為本機的IIS。
右鍵SLNettcpDemo.Server->屬性->Web->User Local IIS Web Server 如圖
注意 記得點擊按鈕“Create Virtual Directory”他將在你本機的IIS默認網站下建立一個虛擬目錄。
添加虛擬目錄后,接下來我們配置一下本機的IIS,讓IIS支持net.tcp通信。
打開IIS,找到本機IIS的默認站點,並選擇編輯綁定,結果如圖
完成上述步驟后,我們需要讓您的虛擬目錄對net.tcp協議支持,因此,這時選中剛才建立的虛擬目錄,並編輯虛擬目錄的高級設置,添加對net.tcp的支持。如下圖
那么在最后我們要在默認站點下放置如下文件clientaccesspolicy.xml,這是一個配置策略文件,告訴IIS如何處理net.tcp協議,切記這個文件命名必須如此,MS明確說的,不要重命名哦。如圖
接下來,我們回到項目SLNettcpDemo.Server,編輯Web.config文件,例如
<?xml version="1.0"?> <configuration> <system.web> <compilation debug="true" targetFramework="4.0" /> </system.web> <system.serviceModel> <services> <service name="SLNettcpDemo.Server.Service1" behaviorConfiguration="behavior1"> <endpoint address="Service1" contract="SLNettcpDemo.Server.IService1" binding="netTcpBinding" bindingConfiguration="tcpConfig" /> <endpoint contract="IMetadataExchange" binding="mexTcpBinding" address="mex" /> <host> <baseAddresses> <add baseAddress="http://localhost/SLNettcpDemo.Server/" /> <add baseAddress="net.tcp://localhost:4502/SLNettcpDemo.Server/" /> </baseAddresses> </host> </service> </services> <bindings> <netTcpBinding> <binding name="tcpConfig" portSharingEnabled="true" closeTimeout="00:20:00" receiveTimeout="00:20:00" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647"> <security mode="None" /> </binding> </netTcpBinding> </bindings> <behaviors> <serviceBehaviors> <behavior name="behavior1"> <serviceMetadata httpGetEnabled="true" /> <serviceDebug includeExceptionDetailInFaults="true" /> <serviceTimeouts transactionTimeout="00:10:00"/> </behavior> </serviceBehaviors> </behaviors> <serviceHostingEnvironment multipleSiteBindingsEnabled="true" /> </system.serviceModel> <system.webServer> <modules runAllManagedModulesForAllRequests="true"/> </system.webServer> </configuration>
配置完畢后,這時我們就要驗證一下我們的服務是否可以正常使用,右鍵Service1.svc文件,選擇在瀏覽器瀏覽,當看到如下截圖時,說明你的服務端配置已經完成了。恭喜恭喜!
配置客戶端
當完成服務端配置是,這時配置客戶端就簡單很多了,右鍵項目SLNettcpDemo.SLClient,添加Web Service 服務引用,如下圖,注意引用地址
點擊OK后,項目SLNettcpDemo.SLClient的目錄會發生一些變化,如下圖:
ClientConfig這個文件很重要,我們看看它有哪些內容
<configuration> <system.serviceModel> <bindings> <customBinding> <binding name="NetTcpBinding_IService1"> <binaryMessageEncoding /> <tcpTransport maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" /> </binding> </customBinding> </bindings> <client> <endpoint address="net.tcp://localhost:4502/SLNettcpDemo.Server/Service1.svc/Service1" binding="customBinding" bindingConfiguration="NetTcpBinding_IService1" contract="Service1.IService1" name="NetTcpBinding_IService1" /> </client> </system.serviceModel> </configuration>
那么這個時候我們進行一些簡單的編碼了,打開MainPage.xaml.cs進行編輯,如下:
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 SLNettcpDemo.SLClient.Service1; namespace SLNettcpDemo.SLClient { public partial class MainPage : UserControl { public MainPage() { InitializeComponent(); Loaded += new RoutedEventHandler(MainPage_Loaded); } void MainPage_Loaded(object sender, RoutedEventArgs e) { var svcClient = new Service1Client(); svcClient.GetDataCompleted += (obj, arg) => { if (arg != null && arg.Result != null) { MessageBox.Show(arg.Result); } }; svcClient.GetDataAsync(123); } } }
編輯完畢,安下F5,一切大功告成。
注意事項
1.本地默認站點對應的線程池必須是.net framework 4的,因此當你的站點還沒有支持.net framework 4時,請重新向IIS注冊一下.net framework 4,具體怎么注冊網站搜羅吧,很多教程。
2.部署的時候,無論是在客戶端配置還是服務端的配置都需要把localhost替換成真實的地址,因此保險的做法就是在vs里進行整個解決方案整體替換。
3.在客戶端所有的服務引用操作都是異步的,所以要注意了。
4.這樣做的方法是便於熟悉日后部署,但是要調試服務端的代碼話非常不方便,幾乎為零。因此有一些解決方案:
a.自己動手寫服務端的單元測試。
b.這里有一篇帖子,服務端是做成控制台程序。感興趣的可以瞅瞅哦。
5.由於NETTCP需要iis7的支持,因此開發環境是xp/win2003的朋友,建議還是不要折騰了,貌似很麻煩的說。
6.net.tcp 在IIS上支持的端口很少,貌似是4502-4530之間,請注意這點哦。
總結
nettcp 在互聯網中應用不太適合,相對要是在局域網里,尤其是企業級開發,它極為適合,SL4對nettcp的支持,對SL的訪問數據效率相對原來的http協議有着極大的提高,同時在WCF通信雙工方面也有着很好的支持,因此感興趣的朋友不妨動手玩玩。
最后請允許我厚着臉皮王婆賣瓜自賣自誇一下,如果您覺得這篇文章有用的話,麻煩您高抬貴手點擊推薦一下吧。謝謝(*^__^*) ……