教程--如何在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通信双工方面也有着很好的支持,因此感兴趣的朋友不妨动手玩玩。
最后请允许我厚着脸皮王婆卖瓜自卖自夸一下,如果您觉得这篇文章有用的话,麻烦您高抬贵手点击推荐一下吧。谢谢(*^__^*) ……