为了把在Windows Azure中运行的,使用强大的WCF框架的服务暴露出来,Windows Azure提供了一个WCF角色。无论在哪个框架和平台上构建复杂的,具有高度可扩展性的系统,通过它们的功能进行逻辑分组,针对那些分组来抽象代码,并 且分别执行它们,都是一种简单而高效的扩展性策略。你应该把用来“绘制图形”的可执行代码分成一组,然后找出图形绘制服务的瓶颈,通过增加负责这个任务的 Windows Azure实例的数量,你可以集中更多的计算能力来完成这个任务。
Windows Communication Foundation (WCF)是一种被广泛使用的客户端/服务端通信技术,它是由微软提供的,而且已经很成熟了。一个WCF服务可以和一个WCF客户端进行通信,也可以和采 用了同样的标准的其他框架的客户端进行通信。本文主要为您讲述在Windows Azure中创建和使用WCF角色的基础知识,以及如何诊断发生在WCF服务内部的错误。除此之外,本文还会为您讲述在把Windows Azure的WCF跟踪信息记录到日志中的过程中,会遇到哪些已知的问题,以及这些问题的基本解决方法。另外,我们会提供相关的源代码。
首 先,我们必须创建一个全新的,使用Windows Azure SDK v1.3的Windows Azure项目,然后给它添加一个新的WCF角色。这个角色是由Visual Studio来创建的,它带有很多有用的基础设置和服务。值得注意的是,创建一个WCF服务并不是唯一的方法,你也可以使用Web角色或者Worker角 色(甚至是一个VM角色!)。但是,如果我们创建了一个使用WCF角色模板的服务,事情会变得更加容易一些。另外,这一点也应该引起我们的注意:使用 WCF角色和使用Web角色没有什么本质区别,如果你使用的是Worker角色,那么情况就有所不同了。区别在于WCF角色和Web角色都是在IIS中托 管WCF服务的,而使用Worker角色的时候,你只能在Windows应用程序中自托管。这方面的具体信息,可以参考:http://msdn.microsoft.com/en-us/library/ms730158.aspx。
让我们回到我们手头的任务上来,为我们的项目创建一个“WCF Service Web Role”:
这会创建一个Web应用程序(类似于Web角色),而且还会添加一些基础的代码文件。
这些是一个非常基础的WCF服务的基本组成部分,现在我来详细说明一下它们都是做什么的。如果你已经是一个WCF方面的老手了,可以跳过这个小节!
AzureLocalStorageTraceListener.cs:
这 是“XmlWriterTraceListener”的一个派生类,“XmlWriterTraceListener”类的主要功能是收集 “System.Diagnostics.Trace”类写入的日志信息,然后通过Xml的形式来输出它们。这是一个具有特定用途的 “XmlWriterTraceListener”——它总是把基于XML的Trace信息写入到LocalStorage的一个区域中。Windows Azure允许一个角色对磁盘的可写区域进行写入操作。用这种特定的方式可以写入文件路径,以便于让Windows Azure Diagnostics框架知道从什么地方选择文件。Windows Azure Diagnostics框架必须要把它们移动到一个角色实例的本地实例中,以便于它们可以跨实例来使用。
IService1.cs:
这 个文件包含一个接口和一个类。它们都很有意思,因为它们的定义都是用特性(attribute)来修饰的。“IService1.cs”中的接口 是用特性[ServiceContract]来修饰的——这意味着在这个应用程序中,这个接口定义了一个服务契约。它可以用于WCF,表示客户端和服务端 都同意可以在这个服务上使用某些方法,在内部,这些方法是用OperationContract]来修饰的。IService1.cs中的类是用特性 [DataContract]来修饰的,它的成员是用特性[DataMember]来修饰的——这为指定客户端和服务端都同意的,可以在客户端和服务端之 间进行传递的消息的细节提供了一种方法。
Service1.svc(和展开它后看到的Service1.svc.cs):
这 个类实现了上面那个用“IService1”来声明的接口,这意味着,当你连接到一个WCF服务(这个服务使用由“Service1.svc”实 现的IService1)的时候,这些才是真正的要执行的逻辑。请注意,在这个例子中,针对“Service1.svc”的路径总是提供这样的功能,但是 在高级的WCF配置中,你可以把.svc替换掉,使用一个可以获得更大灵活性的配置。
Web.config:
这是 Web应用程序的配置文件。值得注意的是,默认情况下,“AzureLocalStorageTraceListener”是被禁用 的,“system.serviceModel”节点定义了我们可以使用“httpGet”(一个比较基础的Web请求)来获取服务的元数据。后面这种设 置很有用,因为在开发过程中,我们可以使用一个浏览器来浏览这个服务。
WebRole.cs:
这是 “RoleEntryPoint”的一个派生类,它控制着WCF角色在Windows Azure中的启动方式。“OnStart”方法用于配置Windows Azure诊断信息是如何迁移到blob storage中的——它每分钟都会按照在“AzureLocalStorageTraceListener”中配置的路径做一次这样的工作。注意,本地 存储器应该这样来定义:
<LocalStorage name=”WcfRole.svclog” sizeInMB=”1000″ cleanOnRoleRecycle=”false” />