承载和使用WCF服务(四) 终了

来源:互联网 发布:淘宝店铺运营计划 编辑:程序博客网 时间:2024/06/06 08:44

承载方案

前两节介绍了用于承载服务的不同方案。此外,还介绍了哪种承载方案可以满足哪些业务要求(或非功能性要求)。通常,可以采用“为什么不是 IIS?”的方法。这是什么意思呢?IIS 在功能方面提供了最佳选择,尤其是在服务要公开多个系统所依赖的关键业务功能的情形下。如果选择 IIS,就必须选择使用 IIS 6.0 还是 IIS 7.0,由于新的激活功能,显然应当选择后者。在需要进程间通信的情形下,WinForms 和控制台应用程序都是可行方案。Windows 服务本质上只是 IIS 的替代方案,并且通常在建立服务器产品或需要对服务的激活和寿命期进行高级控制时使用它。

在下一节中,我们将介绍为使用服务而提供的选项,以及承载方案对使用者端意味着什么。

使用 WCF 服务

在前一节中,我们介绍了不同的承载方案。而所选的承载方案会影响使用者端。使用 WCF 服务可以有多种方式。如果客户端正在使用 WCF,则生产效率将非常高,因为 WCF 附带的工具可以生成用于调用 WCF 服务的代理类。WCF 主要通过 SvcUtil.exe 来提供标准和工具支持,SvcUtil.exe 将作为主要的元数据解释工具。它与 WCF Framework 利用反射询问具有合适属性的类型这一功能结合在一起,使生成和使用 WCF Framework 与现有框架相比,复杂性更低。此外,Visual Studio 2005 带有易用的功能,可以向项目添加服务引用,并可无缝地自动生成代理类。

实际上,您可以有以下选择:

◆从服务检索 WSDL,并手动制作代理来调用服务。这是客户端没有 WCF 时的典型方案。 

◆使用 Visual Studio 2005 的“添加服务引用”功能,并让它生成要在客户端上使用的代理。 

◆使用 SvcUtil.exe 工具生成代理类。

在下面几节中,我们将介绍后面两个选项:Visual Studio 2005 和 SvcUtil.exe。

服务代理

服务代理使您能够以面向对象的方式使用服务。代理类对服务所使用的通信模型进行抽象,这样,客户端开发人员不会直接意识到他正在与(远程)服务对话。这就像在调用本地代码一样。代理类可实现服务的服务接口,从而使您能够调用服务接口上的方法,就好像它们是本地方法。代理是为服务接口中使用的任何自定义类型而生成的。列表 5-11 包含 QuickReturns Ltd. 示例中为 TradeService 服务生成的代理的片段。它演示了在客户端有一个可用 Quote 映射到服务器端上的 Quote 对象,尽管它们是不同的类。Quote 对象按照合同进行序列化,以便它在服务端可以序列化为服务端版本的 Quote 数据合同。此外,可以看到 GetQuote 和 PlaceQuote 方法调用一个基类,而该基类最后将以所配置的传输方式跨服务边界进行调用。

列表 5-11:为 TradeService 服务生成的示例代理

namespace SimpleClientWithProxy.ExchangeService
{
[DataContract()]
public partial class Quote : object, IExtensibleDataObject
{
// 省略了打印代码中的 Quote 数据成员,见示例代码
}
}

[GeneratedCode("System.ServiceModel", "3.0.0.0")]
[ServiceContract()]
public interface ITradeService
{
[
OperationContract(Action =
"http://tempuri.org/ITradeService/GetQuote",
ReplyAction =
"http://tempuri.org/ITradeService/GetQuoteResponse")]
Quote GetQuote(string ticker);

[
OperationContract(Action =
"http://tempuri.org/ITradeService/PublishQuote",
ReplyAction =
"http://tempuri.org/ITradeService/PublishQuoteResponse")]
void PublishQuote(Quote quote);
}

[GeneratedCode("System.ServiceModel", "3.0.0.0")]
public interface ITradeServiceChannel : ITradeService, IClientChannel
{
}

[GeneratedCode("System.ServiceModel", "3.0.0.0")]
public partial class TradeServiceClient : ClientBase,
ITradeService
{
// 省略了打印代码中的一些构造函数,见示例代码

public SimpleClientWithProxy.ExchangeService.Quote
GetQuote(string ticker)
{
return base.Channel.GetQuote(ticker);
}

public void PublishQuote(
SimpleClientWithProxy.ExchangeService.Quote quote)
{
base.Channel.PublishQuote(quote);
}
}

使用 Visual Studio 2005

与创建 ASP.NET 代理相似,如果在 IDE 中右键单击项目,可以看到三个用于添加引用的选项,如图 5-18 所示。

图 5-18:添加对 WCF 服务的引用

您要查找的选项是“添加服务引用”。此菜单选项是 SvcUtil.exe 实用程序周围的包装(下一节将对此进行介绍),它实际上将产生具有所需参数的进程。一旦选择了“添加服务引用”,就将看到在图 5-19 中显示的对话框。

图 5-19:“添加服务引用”对话框

一旦在对话框中单击“确定”,该加载项将产生 SvcUtil.exe,并生成需要的代理类和必需的配置文件(或修改它),并将所需引用添加到项目中。现在,项目的引用将列出 WCF 程序集。

注意 要使该操作有效,必须运行 Windows ServiceHost,或更改 URL 以指向 IIS 中承载的任何服务(使 URL 指向任何 .svc 文件)。

现在,即可开始在服务层中安排第一个服务调用。示例解决方案文件按以下方式进行了修改,以帮助您查看代码:

◆解决方案上的“设置启动项目”已选中多个项目。 

◆ExchangeServiceIISHost Web 项目的“使用动态端口”已设置为 False,并且“端口号”使用硬编码设置。 

需要将对象的简短说明添加到项目中。在 SvcUtil.exe(“添加服务引用”)调用期间,在项目中自动添加了下面的项和引用。其中一些只是为了帮助 Visual Studio 集成;其他则是通过代理直接使用服务所必需的。

◆服务引用:在此文件夹中,我们添加了两项。第一,“映射”文件为通过 Visual Studio 加载项生成和重新生成代理提供支持。第二,ExchangeService.cs 代表具体的代理类实现,它利用命名空间 System.ServiceModel 提供简单的集成类。 

◆配置:第二项是 App.config 文件。App.config 文件(在 Visual Studio 构建过程中将自动重命名为“<程序集名称>.config”)提供运行时 WCF 配置参数。如果看一看此文件的内部,将发现大量设置,其中很多是默认的或多余的。常见做法是,在生成该文件后使用 WCF SvcConfigEditor.exe 编辑器实用程序管理该文件。此实用程序位于 Windows SDK Bin 目录下。还可以在“Visual Studio 2005 工具”菜单中找到它。图 5-20 显示了该工具的实现。  

图 5-20:SvcConfigEditor.exe从图 5-20 中的“SvcConfigEditor.exe”屏幕上可以看到,通过配置可以管理数量巨大的详细属性。这是 WCF 的最强大的优势之一:能够对具体实现的很多方面进行控制,而不会影响核心服务实现。服务实现不需要更改即可从基于 HTTP 的协议迁移到另一个面向消息的协议这一概念就是一个示例。


命令行实现

一种替代方法是直接利用 SvcUtil.exe 实用程序,而不是 Visual Studio 加载项。在从 Visual Studio 中直接执行时,Visual Studio 加载项将再次带参数调用 SvcUtil.exe 以生成代理。通过查看“输出”窗口,并在下拉列表中将“显示输出”设置为“服务引用”,可以看到命令行和该命令的结果。

若要手动生成,可通过选择“开始” | “所有程序” | “Microsoft Windows SDK” | “CMD”,以选择 CMD 窗口。此命令提示符很有用,因为它的路径被设置为 SDK 工具和实用工具所在的二进制目录。

您将使用 SvcUtil.exe 命令行工具生成可在 SimpleClientWithProxy 项目中使用的两个输出。但是,本章附带的示例代码使用了上一节介绍的“添加服务引用”方法。此处介绍的步骤解释了如何生成与“添加服务引用”相同的输出。它生成的输出文件是客户端代理源代码文件和应用程序配置文件。然后,这些文件将合并到客户端项目中。SvcUtil.exe 可以生成这二者。在此示例中,以下命令(它只有一行,尽管此处显示多行)将产生代理类和配置文件:

列表 5-12:用于产生代理类和配置文件的命令

svcutil /config:app.config /out:"ExchangeService.cs" /language:csharp
/n:*,
SimpleClientWithProxy.ExchangeService
"http://localhost/ExchangeService/?
ExchangeService.svc"

警告:要让此操作有效,需要一个正在运行的 Windows ServiceHost 版本,或者必须更改 URL 以指向 IIS 中承载的任何服务(使 URL 指向本章讨论的任何 .svc 文件)。此外,服务需要 metadataexchange 端点,第 3 章对此进行了介绍。本章附带的代码配置了 metadataexchange 端点,但在本章中它不在内嵌代码内!

命令有很好的自解释功能。/n 开关表明生成的代理类应当属于哪个命名空间。最后一个参数是可以在其上找到架构信息的服务端点的 URL。注意,?wsdl 可以替换为 ?mex,因为 SvcUtil.exe 同时支持两种发现方法。通过从命令提示符执行 svcutil.exe /?,可以获得进一步帮助。

下一步是获得输出文件 ExchangeService.cs 和 App.config,并将它们合并到项目中。通过从 Visual Studio 2005 中的“项目”菜单选择“添加现有项”,可以将第一个文件 ExchangeService.cs 直接添加到项目中。

第二个文件必须作为应用程序配置 (App.config) 文件添加到项目中。如果项目还没有 App.config 文件,则可以从“项目”菜单中再次选择“添加现有项”以添加该文件。如果已有现成的 App.config,则必须合并 system.serviceModel 部分,以确保具备所有适当的子元素。

结论

在了解了有关承载的可选方案的所有内容后,您将能够构建 WCF 应用程序,并在任何需要的地方承载它们。此外,您还能够解释在最新可用环境(Windows Vista 或 Windows Server 2007 上的 IIS 7.0 与 WAS)中进行承载的好处。

原创粉丝点击