教程--如何在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通信双工方面也有着很好的支持,因此感兴趣的朋友不妨动手玩玩。

     最后请允许我厚着脸皮王婆卖瓜自卖自夸一下,如果您觉得这篇文章有用的话,麻烦您高抬贵手点击推荐一下吧。谢谢(*^__^*) ……

posted @ 2012-10-08 23:26  月涯  阅读(2457)  评论(7编辑  收藏  举报