教程--如何在silverlight下進行net.tcp通信操作配置,包管用!


前言

  最近接一個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通信雙工方面也有着很好的支持,因此感興趣的朋友不妨動手玩玩。

     最后請允許我厚着臉皮王婆賣瓜自賣自誇一下,如果您覺得這篇文章有用的話,麻煩您高抬貴手點擊推薦一下吧。謝謝(*^__^*) ……


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM