专著于富媒体技术~
本站某些作品来源于互联网,如果侵犯了您的利益,请留言说明!
本站某些作品来源于互联网,如果侵犯了您的利益,请留言说明!
开源项目FluorineFx就是专门针对.NET平台与Flex通信提供的AMF协议通信网关,我们可以通过FluorineFx很方便的完成与.NET的通信。
FluorineFx官方提供了安装包的下载和在线文档,可以帮助我们有效的利用FluorineFx来开发。
FluroineFx官方网站:http://www.fluorinefx.com/
FluroineFx下载地址:http://www.fluorinefx.com/download.html
FluroineFx在线文档:http://www.fluorinefx.com/docs/fluorine/index.html
OK,下面我们来看看使用FluroineFx通信的.NET和Flex配置。开发环境选择如下:
.NET:Microsoft Visual Studio 2008 + .NET Framework 3.5
Flex:Adobe Flex Builder CS3 + Flex SDK 3.2
FluroineFx:FluorineFx v1.0.0.15 (点击可下载)
一、.NET服务端的开发
通过Microsoft Visual Studio 2008 创建创建解决方案,并添加FluroineFx服务器库,如下图示:
FluorineFx服务库添加成功后会发现,项目模板会自动为我们创建一个Sample类和一个Echo方法,如下:
namespace FlexDotNet.ServiceLibrary
{
/// <summary>
/// Fluorine sample service.
/// </summary>
[RemotingService("Fluorine sample service")]
public class Sample
{
public Sample()
{
}
public string Echo(string text)
{
return "Gateway echo: " + text;
}
}
}
{
/// <summary>
/// Fluorine sample service.
/// </summary>
[RemotingService("Fluorine sample service")]
public class Sample
{
public Sample()
{
}
public string Echo(string text)
{
return "Gateway echo: " + text;
}
}
}
接着添加FluorineFx 网站到解决方案,添加成功后网站会自动引用FluorineFx服务库的dll。如下图:
到这里我们可以简单的测试FluorineFx的.NET服务端是否成功创建。通过在浏览器中查看FluroineFx网站中的Console.aspx或是将网站设置为启动项目并设置Console.aspx为启始页运行网站都可以,程序便会运行到FluorineFx的控制台,展开左边项目的Services节点便会看到上面模板为我们创建的类和方法,点击方法节点在右边就可以进行简单的测试了,如下图示:
OK,到这里.NET的服务器端就开发完成了,这里我们需要记住几点,在接下来的Flex开发中需要根据这些参数来进行配置。
FluorineFx的.NET网站目录:F:\Demo\FlexDotNet\Web
FluorineFx的.NET网站虚拟目录:/Web
FluorineFx的.NET网站URL:http://localhost:2836/Web
接受Flex客户端请求的URL:http://localhost:2836/Web/Gateway.aspx
有了上面这些东西配置Flex就简单了,首先创建Flex项目,并将项目路径指向前建立的FluorineFx网站的根路径:
如上图,将Application type设置为:Web application,Application Server type设置为:ASP.NET,然后“Next”。进入下一个创建项目向导界面,将Server设置为:"Use Internet Information Services (IIS)",Web Application root同样指向FluorineFx网站的根路径,Web Appliation URL则设置为上面我们获取到的路径便OK,详细见下图:
按照上面步骤配置好后通过点击“Validate Configuration”进行配置验证,如过验证结果是: The web application root and the URL are valid.则代表配置正确,可以直接点下一步只到完成项目的创建。
Flex项目创建完毕,下面在通过一些相应的配置就可以通过FluorineFx和.NET通信了。开发项目属性设置面板,设置其Flex Compiler为下图所示(-services的配置也可以设置为相对路径):
设置Flex Server为如下配置,可以点“Validate Location”验证设置的正确性:
[img]attachment.php?fid=238
最后设置输出路径就完成了Flex端的配置了:
到这里Flex端的配置就全部完成,下面我们通过FluorineFx库模板为我们生成的Sample为例来测试下该环境是否可以通过,在Flex的mxml文件下通过<mx:RemoteObject>标签来访问远程对象,详细如下:
<mx:RemoteObject id="service" destination="fluorine"
source="FlexDotNet.ServiceLibrary.Sample">
<mx:method name="Echo" result="onResult(event)">
</mx:method>
</mx:RemoteObject>
source="FlexDotNet.ServiceLibrary.Sample">
<mx:method name="Echo" result="onResult(event)">
</mx:method>
</mx:RemoteObject>
这里需要注意的是destination需要设置为与remoting-config.xml中的destination的id一致,source则配置为远程对象的全路径(名称空间+类),通过<mx:method>标签配置远程对象下的方法并设置其成功调用后的结果处理函数,下面便可通过id去调用远程方法了。
<mx:Script>
<![CDATA[
import mx.rpc.events.ResultEvent;
internal function onClick():void
{
service.Echo(txtInput.text);
}
internal function onResult(evt:ResultEvent):void
{
txtResult.text = evt.result.toString();
}
]]>
</mx:Script>
<![CDATA[
import mx.rpc.events.ResultEvent;
internal function onClick():void
{
service.Echo(txtInput.text);
}
internal function onResult(evt:ResultEvent):void
{
txtResult.text = evt.result.toString();
}
]]>
</mx:Script>
下面是完整的Flex客户端mxml的代码定义:
完整的示例代码
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
<mx:RemoteObject id="service" destination="fluorine"
source="FlexDotNet.ServiceLibrary.Sample">
<mx:method name="Echo" result="onResult(event)">
</mx:method>
</mx:RemoteObject>
<mx:Script>
<![CDATA[
import mx.rpc.events.ResultEvent;
internal function onClick():void
{
service.Echo(txtInput.text);
}
internal function onResult(evt:ResultEvent):void
{
txtResult.text = evt.result.toString();
}
]]>
</mx:Script>
<mx:Panel x="53" y="52" width="250" height="200" layout="absolute" title="测试FluorineFx" fontSize="12">
<mx:TextInput x="35" y="21" id="txtInput"/>
<mx:Button x="35" y="63" label="确 定" fontWeight="normal" click="onClick()"/>
<mx:Label x="35" y="95" text="结 果:"/>
<mx:TextInput x="35" y="123" width="160" id="txtResult"/>
</mx:Panel>
</mx:Application>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
<mx:RemoteObject id="service" destination="fluorine"
source="FlexDotNet.ServiceLibrary.Sample">
<mx:method name="Echo" result="onResult(event)">
</mx:method>
</mx:RemoteObject>
<mx:Script>
<![CDATA[
import mx.rpc.events.ResultEvent;
internal function onClick():void
{
service.Echo(txtInput.text);
}
internal function onResult(evt:ResultEvent):void
{
txtResult.text = evt.result.toString();
}
]]>
</mx:Script>
<mx:Panel x="53" y="52" width="250" height="200" layout="absolute" title="测试FluorineFx" fontSize="12">
<mx:TextInput x="35" y="21" id="txtInput"/>
<mx:Button x="35" y="63" label="确 定" fontWeight="normal" click="onClick()"/>
<mx:Label x="35" y="95" text="结 果:"/>
<mx:TextInput x="35" y="123" width="160" id="txtResult"/>
</mx:Panel>
</mx:Application>
本文示例截图:
Flex中的远程对象访问,也就是服务端提供一个远程服务对象(RemotingService Object),在Flex客户端通过相应的访问技术去调用远程对象的过程。
在本系列文章的前面几篇文章中所介绍的访问Webservice的方法,也就是一种远程对象方法,只不过他是基于WEB服务(WebServie)的远程访问,不是基于远程对象(Remoting Object)的的远程访问。要想直接实现基于对象的远程访问是比较麻烦的,然后FluorineFx则专门为我们提供了该功能,通过FluorineFx的核心库来开发远程对象(Remoting Object)服务,具体是怎么实现的呢?FluorineFx要求为远程对象提供[RemotingService]标记来提供远程对象服务,看看下面的RemotingServiceAttribute的详细定义:
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
public sealed class RemotingServiceAttribute : Attribute
{
public RemotingServiceAttribute();
public RemotingServiceAttribute(string serviceName);
}
public sealed class RemotingServiceAttribute : Attribute
{
public RemotingServiceAttribute();
public RemotingServiceAttribute(string serviceName);
}
从上一篇文章中的示例代码可以看出,使用.NET(c#)定义了一个Sample的远程对象服务类,并为其指定了[RemotingService],详细如下:
[RemotingService("Fluorine sample service")]
public class Sample
{
public Sample()
{
}
public string Echo(string text)
{
return "Gateway echo: " + text;
}
}
public class Sample
{
public Sample()
{
}
public string Echo(string text)
{
return "Gateway echo: " + text;
}
}
以上搭建FluorineFx与.NET的开发环境过程已经完成,下面介绍Flex客户端调用FluorineFx的远程对象示例,我们在来看看这个示例:
<mx:RemoteObject id="service" destination="fluorine"
source="FlexDotNet.ServiceLibrary.Sample">
<mx:method name="Echo" result="onResult(event)">
</mx:method>
</mx:RemoteObject>
source="FlexDotNet.ServiceLibrary.Sample">
<mx:method name="Echo" result="onResult(event)">
</mx:method>
</mx:RemoteObject>
<mx:Script>
<![CDATA[
import mx.rpc.events.ResultEvent;
internal function onClick():void
{
service.Echo(txtInput.text);
}
internal function onResult(evt:ResultEvent):void
{
txtResult.text = evt.result.toString();
}
]]>
</mx:Script>
<![CDATA[
import mx.rpc.events.ResultEvent;
internal function onClick():void
{
service.Echo(txtInput.text);
}
internal function onResult(evt:ResultEvent):void
{
txtResult.text = evt.result.toString();
}
]]>
</mx:Script>
如上可实现远程对象访问,通过Flex的非可视化组件<mx:RemoteObject>进行远程对象连接。其中的source属性指定远程对象,格式为全限定名(命名空间+类名)。destination属性是非常重要的,这决定了Flex客户端是否可以正确的访问到远对象,相关配置如下:
<destination id="fluorine">
<properties>
<source>*</source>
</properties>
</destination>
<properties>
<source>*</source>
</properties>
</destination>
在<mx:RemoteObject>组件内部使用<mx:Mothod>组件配置远程对象中的方法,详细见本文前面部分。要真实实现远程对象访问的核心是对象的适配器和连接通道:
<?xml version="1.0" encoding="UTF-8"?>
<service id="remoting-service"
class="flex.messaging.services.RemotingService"
messageTypes="flex.messaging.messages.RemotingMessage">
<adapters>
<adapter-definition id="dotnet" class="FluorineFx.Remoting.RemotingAdapter" default="true"/>
</adapters>
<default-channels>
<channel ref="my-amf"/>
</default-channels>
<destination id="fluorine">
<properties>
<source>*</source>
</properties>
</destination>
</service>
<service id="remoting-service"
class="flex.messaging.services.RemotingService"
messageTypes="flex.messaging.messages.RemotingMessage">
<adapters>
<adapter-definition id="dotnet" class="FluorineFx.Remoting.RemotingAdapter" default="true"/>
</adapters>
<default-channels>
<channel ref="my-amf"/>
</default-channels>
<destination id="fluorine">
<properties>
<source>*</source>
</properties>
</destination>
</service>
实际开发中我们可以进行自定义通信通道,默认情况下是使用FluorineFx为我们提供的默认连接通道:
<channels>
<channel-definition id="my-amf" class="mx.messaging.channels.AMFChannel">
<endpoint uri="http://{server.name}:{server.port}/{context.root}/Gateway.aspx" class="flex.messaging.endpoints.AMFEndpoint"/>
<properties>
<!-- <legacy-collection>true</legacy-collection> -->
</properties>
</channel-definition>
</channels>
<channel-definition id="my-amf" class="mx.messaging.channels.AMFChannel">
<endpoint uri="http://{server.name}:{server.port}/{context.root}/Gateway.aspx" class="flex.messaging.endpoints.AMFEndpoint"/>
<properties>
<!-- <legacy-collection>true</legacy-collection> -->
</properties>
</channel-definition>
</channels>
出处:Bēniaǒ成长笔记
转载时必须以链接形式注明出处及本声明!
牛C网推荐您再看看以下日志:
.Net在SqlServer中的图片存取技术
NET Framework 用C#创建SHELL扩展
C#中 const 和 readonly 的区别
浅谈 DotNet 保护中字符串加密的技术
ASP.NET实现窗体和窗体之间传送数据
ASP.NET窗体对话框的实现
web应用程序中的数据库连接
ASP.NET 2.0移动开发入门之基础
.NET 3.x新特性之Lambda表达式
使用ASP.NET Atlas编写显示真实进度的ProgressBar
.Net在SqlServer中的图片存取技术
NET Framework 用C#创建SHELL扩展
C#中 const 和 readonly 的区别
浅谈 DotNet 保护中字符串加密的技术
ASP.NET实现窗体和窗体之间传送数据
ASP.NET窗体对话框的实现
web应用程序中的数据库连接
ASP.NET 2.0移动开发入门之基础
.NET 3.x新特性之Lambda表达式
使用ASP.NET Atlas编写显示真实进度的ProgressBar
上一篇



