您的位置:首页 > 理论基础 > 计算机网络

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

2012-10-08 23:26 661 查看

前言

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

最后请允许我厚着脸皮王婆卖瓜自卖自夸一下,如果您觉得这篇文章有用的话,麻烦您高抬贵手点击推荐一下吧。谢谢(*^__^*) ……
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐