前言
最近接一個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一下的您解決方案吧
例如下圖

0924311044-0  

佈建服務
為了更直接的說明如何配置,這裡我們就不重新設計服務了,就用專案建立預設的IService1吧,那麼我們接下來講講如何佈建服務的。
1.首先打開的你的一些功能服務,本人用的是WIN7,因此需要在控制台->程式->打開或關閉Windows功能裡找到如下選項

0924314N4-1  

選中後點擊確定,完成後你會做服務裡找到如下一些已啟動的服務,如圖

09243141P-2  

2.完成如上配置後,那麼下一步我們是修改解決方案裡服務端依賴的IIS,由VS欄位的IIS改為本機的IIS。
右鍵SLNettcpDemo.Server->屬性->Web->User Local IIS Web Server 如圖

0924316425-3  

注意 記得點擊按鈕「Create Virtual Directory」他將在你本機的IIS預設網站下建立一個虛擬目錄。
添加虛擬目錄後,接下來我們配置一下本機的IIS,讓IIS支援net.tcp通信。
打開IIS,找到本機IIS的預設網站,並選擇編輯綁定,結果如圖

0924315631-4  

完成上述步驟後,我們需要讓您的虛擬目錄對net.tcp協定支援,因此,這時選中剛才建立的虛擬目錄,並編輯虛擬目錄的高級設置,添加對net.tcp的支援。如下圖

0924314352-5  

那麼在最後我們要在預設網站下放置如下檔clientaccesspolicy.xml,這是一個配置策略檔,告訴IIS如何處理net.tcp協定,切記這個檔命名必須如此,MS明確說的,不要重命名哦。如圖

092431HI-6  

接下來,我們回到專案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檔,選擇在瀏覽器流覽,當看到如下截圖時,說明你的服務端配置已經完成了。恭喜恭喜!

09243150a-7  

配置用戶端
當完成服務端配置是,這時配置用戶端就簡單很多了,右鍵專案SLNettcpDemo.SLClient,添加Web Service 服務引用,如下圖,注意引用位址

092431C96-8  

點擊OK後,專案SLNettcpDemo.SLClient的目錄會發生一些變化,如下圖:

0924315205-9  

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,一切大功告成。

0924314646-10  


注意事項
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通信雙工方面也有著很好的支援,因此感興趣的朋友不妨動手玩玩。
創作者介紹
創作者 shadow 的頭像
shadow

資訊園

shadow 發表在 痞客邦 留言(0) 人氣()