Silverlight已经到4.0版本了,已经相当成熟了,在Silverlight中使用socket与服务器进行通信也是常见的需求,所以,作为.NET平台的通信框架,ESFramework支持Silverlight开发是必须的。
ESFramework.SL 即是ESFramework提供的Silverlight开发组件,其完整实现了基于流的TCP客户端网络引擎,并与其非Silverlight的接口完全一致(即是ESFramework 4.0 快速上手文中提到的IRapidPassiveEngine)。也就是说,我们完全可以将ESFramework 4.0 快速上手 一文中提到的客户端引擎替换为ESFramework.SL的引擎来讲解,仍然是正确的。这两个Rapid客户端引擎,一个工作于windows应用程序,一个工作于Silverlight应用程序。但是,它们都可以共用同一个Rapid服务端引擎(IRapidServerEngine)。
一.Silverlight 安全验证
如同flash的socket编程的安全策略一样,在Silverlight中使用Socket,也需要安全策略验证。我们的服务器上必须启动Silverlight策略服务器程序监听943端口。SilverLight内置的Socket会在连接目标TCP端口之前先自动连接943端口以获取验证,通过验证后,才会去连接目标端口。
比如说,我们的服务端应用程序在192.168.0.20的机器上使用TCP端口4530提供服务,当Silverlight的Socket连接4530端口之前,该Socket会自动先连接192.168.0.20的943端口,以进行安全验证,验证的过程是这样的:该Socket与192.168.0.20的943端口的TCP连接建立成功后,会发送"<policy-file-request/>"(UTF-8编码)给Silverlight策略服务器程序,策略服务器程序收到后,给客户端回复下面的内容以表示验证通过:
<?xml version="1.0" encoding ="utf-8"?>
<access-policy>
<cross-domain-access>
<policy>
<allow-from>
<domain uri="*" />
</allow-from>
<grant-to>
<socket-resource port="4502-4534" protocol="tcp" />
</grant-to>
</policy>
</cross-domain-access>
</access-policy>
客户端的Socket接收到这段回复后,才确认已经通过安全验证了。接下来,才会正式去连结192.168.0.20的4530端口。
这个安全验证的过程,是由Socket自动完成的。针对ESFramework.SL.RapidPassiveEngine来说,就是在调用其Initialize方法时,自动发生的。
要注意一点,服务器回复的策略文件的内容中包含“<socket-resource port="4502-4534" protocol="tcp" />” ,其含义是允许客户端以TCP的方式连接本服务器的4502-4534端口。所以,我们的服务端应用程序必须使用4502到4534之间的端口提供服务。
二.Silverlight 策略服务器
客户端的Socket的安全验证是自动完成的,但是安全验证的服务端程序必须由我们自己写。从上面的描述来看,所有的Silverlight安全验证都可以使用同一个服务端程序,所以,ESFramework 提供了Silverlight策略服务器程序ESFramework.SLPolicyServer.exe(从ESFramework 4.0 概述文末下载),可以直接拿来使用。
在启动你自己的服务端程序之前,请在同一台机器先启动ESFramework.SLPolicyServer.exe,其运行界面如下:
三.使用ESFramework.SL.RapidPassiveEngine
ESFramework.SL.RapidPassiveEngine的使用方法与ESPlus.Rapid.RapidPassiveEngine是一样的,详细可以参见ESFramework 4.0 快速上手。
ESFramework.SL 也可以从ESFramework 4.0 概述文末下载。
ESFramework 4.0 概述 (文末包含最新版本的ESFramework4.0以及相关demo、帮助文档下载)