将 Flex 4 与 WCF 服务连接






4.43/5 (4投票s)
WCF 和 Flex 为在 .NET 中开发服务器端功能以及使用 Flex/ActionScript 实现丰富的客户端应用程序提供了诸多优势。这两种技术之间的集成问题经常被提出,因为开发人员和业务部门希望利用框架提供的最佳功能。
解决方案
至少有两种方法可以解决这个问题。一种方法是使用 WCF 中的 HTTP/SOAP 绑定将 WCF 服务公开为 Web 服务。Flex 客户端可以使用 WebService API 连接到 WCF。另一种方法是在 Flex 端使用 AMF/Remoting,并利用服务器上的远程处理网关的功能与 WCF 通信。本篇指南将回顾使用 WebORB for .NET 作为远程处理网关的后者方法。WebORB 以社区版(免费产品)或商业版(企业版)的形式提供。本指南中描述的所有功能在产品的社区版中均可免费获得。
详细说明
集成选项 - Web 服务、AMF 等。
Flex 和 .NET 集成包括多种选项,例如 Web 服务、HTTP 服务和 AMF Remoting。每种选项都有其优点和缺点。特别是对于 WCF,.NET 端的框架支持将 WCF 服务公开为 SOAP/REST Web 服务。由于 Flex 内置支持 SOAP Web 服务,因此可以使用该方法集成客户端和服务器环境。但重要的是要理解,通过 Web 服务集成可能会对应用程序的性能以及开发时间表(上市时间)产生负面影响。这种影响主要由 Web 服务方法可能需要的复杂性和额外的手动编码引起。至于性能影响,请参阅 AMF/Remoting 与 Web 服务比较基准测试文章。根据我们的经验,在性能和开发速度方面都能提供最佳应用程序的方法是基于 Flex 客户端和 WCF 服务之间的 AMF Remoting。这种集成的一个例子是包含 Flex 客户端和 .NET 后端之间的 AMF 远程处理网关的架构。Flex 客户端使用 RemoteObject API 与远程处理网关通信,该网关会将请求代理到后端的 WCF 服务。WebORB for .NET 是一个 AMF 远程处理网关的例子,它具有可靠且经过行业验证的业绩记录。
开发 WCF 服务
在本文中,您将开发一个托管在 IIS 中的 WCF 服务。该服务将作为远程处理服务公开,可以使用 WebORB for .NET 被 Flex 客户端调用。WebORB 将处理 WCF 服务的调用并将调用结果传递回 Flex。未来的文章将回顾类似的集成,其中 WCF 服务未托管在 IIS 中,而是独立运行在 WCF 的服务主机中。要开始,请按照以下页面回顾的示例开发一个示例 WCF 服务:http://msdn.microsoft.com/en-us/library/ms733766.aspx。您开发的应具有以下源代码
using System;
using System.ServiceModel;
namespace Microsoft.ServiceModel.Samples
{
[ServiceContract]
public interface ICalculator
{
[OperationContract]
double Add( double n1, double n2 );
[OperationContract]
double Subtract( double n1, double n2 );
[OperationContract]
double Multiply( double n1, double n2 );
[OperationContract]
double Divide( double n1, double n2 );
}
public class CalculatorService : ICalculator
{
public double Add( double n1, double n2 )
{
return n1 + n2;
}
public double Subtract( double n1, double n2 )
{
return n1 - n2;
}
public double Multiply( double n1, double n2 )
{
return n1 * n2;
}
public double Divide( double n1, double n2 )
{
return n1 / n2;
}
}
}
您还可以下载一个包含上述源代码的 Visual Studio 项目。
您的服务和 Web 应用程序的配置文件(web.config)应包含以下元素
<?xml version="1.0" encoding="utf-8"
?>
<configuration>
<system.serviceModel>
<services>
<service
name="Microsoft.ServiceModel.Samples.CalculatorService">
<endpoint address=""
binding="wsHttpBinding"
contract="Microsoft.ServiceModel.Samples.ICalculator" />
</service>
</services>
</system.serviceModel>
</configuration>
要完成应用程序服务器端的部署,请将 WebORB 部署到您 WCF 服务正在运行的已创建的 ASP.NET 应用程序中。请确保将 WebORB 管理控制台包含在部署中,以便您可以验证您的 WCF 服务是否存在。为此,请导航到应用程序中的“weborb.aspx”,控制台应该会打开。如果您使用 WebORB 版本 3,请选择“Management”,然后在“services”选项卡中找到包含您的 WCF 代码的程序集。如果您使用 WebORB 版本 4,您应该在“Services”部分下的“WCF Services”节点下找到您的 WCF 服务。
或者,您可以创建一个包含上述源代码的类库,并将其部署到安装程序创建的默认 WebORB 应用程序中。请确保使用上述配置修改 web.config。
开发 Flex 客户端
使用 Flash Builder 创建 Flex 项目,如《Flex 与 .NET 集成入门》文章中所述。将默认 MXML 应用程序的内容替换为下方显示的源代码。您也可以下载并使用完整的源代码列表进行示例。
<?xml version="1.0"
encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/halo"
creationComplete="init()">
<fx:Script>
<![CDATA[
import mx.controls.Alert;
import mx.rpc.events.FaultEvent;
import mx.rpc.events.ResultEvent;
import mx.rpc.remoting.RemoteObject;
[Bindable]
private var ops:Array = ["+", "-", "*", "/" ];
private var wcfProxy:RemoteObject;
private function init():void
{
wcfProxy = new RemoteObject( "GenericDestination" );
wcfProxy.source =
"Microsoft.ServiceModel.Samples.CalculatorService";
wcfProxy.addEventListener( ResultEvent.RESULT, gotResult );
wcfProxy.addEventListener( FaultEvent.FAULT, gotError );
}
private function calculate():void
{
if( opList.selectedLabel == "+" )
wcfProxy.Add( arg1.text as Number, arg2.text as Number );
else if( opList.selectedLabel == "-" )
wcfProxy.Subtract( arg1.text as Number, arg2.text as
Number );
else if( opList.selectedLabel == "*" )
wcfProxy.Multiply( arg1.text as Number, arg2.text as
Number );
else
wcfProxy.Divide( arg1.text as Number, arg2.text as Number
);
}
private function gotResult( event:ResultEvent ):void
{
result.text = event.result.toString();
}
private function gotError( event:FaultEvent ):void
{
Alert.show( "Server reported an error - " +
event.fault.faultDetail );
}
]]>
</fx:Script>
<s:Panel y="10" height="258" width="405" x="10" title="WCF
Calculator">
<mx:Form left="20" right="20" top="20">
<mx:FormItem label="Argument 1">
<s:TextInput id="arg1" width="100%"/>
</mx:FormItem>
<mx:FormItem label="Operator">
<mx:ComboBox id="opList" editable="false" width="100%"
dataProvider="{ops}" />
</mx:FormItem>
<mx:FormItem label="Argument 2">
<s:TextInput id="arg2" width="100%"/>
</mx:FormItem>
</mx:Form>
<s:Button x="20" y="149" label="Calculate"
click="calculate()"/>
<s:Label x="21" y="183" text="Result:"/>
<s:Label x="69" y="178" id="result" />
</s:Panel>
</s:Application>
Flex 客户端使用 AMF Remoting (RemoteObject) API 调用 WCF 服务操作。这与从 Flex 调用常规 .NET 方法无异。在服务器端,当调用 WCF 操作时,处理方式将取决于安装的 WebORB 版本。
使用 WebORB 版本 3 时,调用处理将与常规 .NET 程序集/类相同。然而,该产品的版本 4 会自动检测目标服务是 WCF 服务,并包含特殊的处理逻辑来适应 WCF 调用处理管道。在这种情况下,大多数 WCF 操作/类注释将包含在处理中。
调用结果值的序列化处理方式与非 WCF 类相同。WebORB 将返回值序列化为 AMF,并将响应传递回 Flex。
本文的副本也可在Midnight Coders 网站上找到。