本示例演示如何将来自 COM+ 应用程序的接口作为 Windows Communication Foundation (WCF) 服务公开以及如何从 WCF 客户端调用此服务。本示例由客户端控制台程序 (.exe) 和在 COM+ 内注册的企业服务库应用程序 (.dll) 组成。
提示
本主题的最后介绍了此示例的设置过程和生成说明。
提示
必须将本示例的 Visual Basic 版本配置为服务器应用程序并在处理之外承载,以便在 64 位版本的 Windows 操作系统上运行。有关如何将示例配置为服务器应用程序的更多详细信息,请参见 Configuring COM+ Applications(配置 COM+ 应用程序)。
企业服务应用程序包含一个实现单一 ICalculator
接口的单一组件,此接口公开数学方法(加、减、乘和除)。
// Define the component's interface.
public interface ICalculator
{
double Add(double n1, double n2);
double Subtract(double n1, double n2);
double Multiply(double n1, double n2);
double Divide(double n1, double n2);
}
此接口作为定义请求-答复通信模式的服务协定公开。客户端向数学运算发出同步请求,服务和基础组件使用结果进行回复。客户端活动显示在控制台窗口中。
此服务由 Internet 信息服务 (IIS) 在进程内承载,并由发送到服务的第一个消息激活。ESCalculatorService
类的实现计算并返回适当的结果。
// Supporting implementation for the ICalculator interface.
public class ESCalculatorService : ServicedComponent, 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;
}
}
提示
此类不包括任何 ServiceModel 特定的代码,是具有企业服务属性、经过签名并添加到全局程序集缓存 (GAC) 中的典型企业服务程序集。
COM+ Service Model Configuration Tool (ComSvcConfig.exe) 用于为选定的接口添加支持服务。使用下面的语法可以执行此操作。
ComSvcConfig.exe /install /application:ServiceModelSample /contract:ServiceModelSample.ESCalculator,ICalculator hosting:was /webDirectory:ServiceModelSamples /mex /verbose
在本例中,该工具为 ServiceModelSample.ESCalculator 组件的 ICalculator
接口添加服务,该组件位于在 ServiceModelSample 应用程序中。由 ServiceModelSample 虚拟目录中的 IIS 承载该服务。已添加的服务公开一个单一终结点以便与该服务进行通信。默认情况下,用于与服务通信的终结点地址是根据组件的 ProgID(即 https://localhost/ServiceModelSamples/ServiceModelSample.ESCalculator.svc)构造的,但可以通过更改 .svc 服务文件的名称来修改此服务终结点地址。该工具将服务的绑定的配置添加到 Web.config 文件。服务的绑定的配置默认为标准 wsHttpBinding 绑定,此绑定为寻址和安全使用 SOAP 1.2 和 Web 服务标准提供 HTTP 通信。
该工具还在 https://localhost/ServiceModelSamples/ServiceModelSample.ESCalculator.svc/mex 位置公开元数据交换 (MEX) 终结点,并能够从浏览器中通过在 https://localhost/ServiceModelSamples/ServiceModelSample.ESCalculator.svc?wsdl 位置进行 HTTP GET 来访问 WSDL 元数据。省略 /mex 工具选项可禁用这些元数据功能。
服务协定直接派生自 ICalculator
接口,它等效于下面的 ServiceContract 定义。
[ServiceContract(Namespace="http://Microsoft.ServiceModel.Samples")]
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);
}
客户端使用由Service Metadata Utility Tool (Svcutil.exe) 生成的客户端在协定上通信。在 generatedClient.cs 文件中包含客户端。该实用工具检索服务的元数据并生成用于在协定类型上通信的客户端。承载服务必须可以生成代理代码,因为使用承载服务来检索更新的元数据。在客户端目录中通过命令提示符运行以下命令以生成类型化代理:
svcutil.exe /n:http://Microsoft.ServiceModel.Samples,Microsoft.ServiceModel.Samples https://localhost/ServiceModelSamples/ServiceModelSample.ESCalculator.svc/mex /out:generatedClient.cs
如果生成的客户端可在给定的协定上进行通信,则客户端通过配置相应地址和绑定可以访问给定的服务终结点。像服务一样,客户端使用配置文件 (App.config) 指定与其通信的终结点。客户端终结点配置由配置名称、服务终结点的绝对地址、绑定和协定组成。
<system.serviceModel>
<client>
<endpoint
address="https://localhost/ServiceModelSamples/servicemodelsample.escalculator.svc/ICalculator"
binding="wsHttpBinding"
bindingConfiguration="comNonTransactionalBinding"
contract="ICalculator" />
</client>
<bindings>
<wsHttpBinding>
<binding name="comNonTransactionalBinding" >
<reliableSession enabled="true"/>
</binding>
</wsHttpBinding>
</bindings>
</system.serviceModel>
客户端实现将构造生成的客户端的实例。然后可以使用该实例开始与服务通信。
// Create a client.
CalculatorClient client = new CalculatorClient();
// Call the Add service operation.
double value1 = 100.00D;
double value2 = 15.99D;
double result = client.Add(value1, value2);
Console.WriteLine("Add({0},{1}) = {2}", value1, value2, result);
// Call the Subtract service operation.
value1 = 145.00D;
value2 = 76.54D;
result = client.Subtract(value1, value2);
Console.WriteLine("Subtract({0},{1}) = {2}", value1, value2, result);
// Call the Multiply service operation.
value1 = 9.00D;
value2 = 81.25D;
result = client.Multiply(value1, value2);
Console.WriteLine("Multiply({0},{1}) = {2}", value1, value2, result);
// Call the Divide service operation.
value1 = 22.00D;
value2 = 7.00D;
result = client.Divide(value1, value2);
Console.WriteLine("Divide({0},{1}) = {2}", value1, value2, result);
//Closing the client gracefully closes the connection and cleans up resources.
client.Close();
运行示例时,操作请求和响应将显示在客户端控制台窗口中。这演示从 WCF 客户端生成的 WCF 服务的用法。在客户端窗口中按 Enter 可以关闭客户端。
Add(100,15.99) = 115.99
Subtract(145,76.54) = 68.46
Multiply(9,81.25) = 731.25
Divide(22,7) = 3.14285714285714
Press <ENTER> to terminate client.
设置和生成示例
若要生成 C# 或 Visual Basic .NET 版本的解决方案,请按照生成 Windows Communication Foundation 示例中的说明进行操作。
确保 \InetPub\wwwroot\ServiceModelSamples 及其 bin 子目录为空。
在命令提示符下,定位到示例的 service\bin 文件夹。如果使用 Windows Vista 或 Windows Server 2008,请确保以管理员身份运行命令提示。
输入 gacutil.exe /i ESCalculator.dll 以将该程序集添加到全局程序集缓存中。确保 Gacutil.exe 在您的路径中。
输入 regsvcs.exe ESCalculator.dll 以使用 COM+ 注册该程序集的组件和 ServiceModelSample 应用程序。确保 Regsvcs.exe 在您的路径中。
输入 ComSvcConfig.exe /install /application:ServiceModelSample /contract:"ServiceModelSample.ESCalculator,ICalculator" /hosting:was /webDirectory:ServiceModelSamples /mex /verbose 以将该接口作为 IIS 承载的服务公开。
确保 ComSvcConfig.exe 在您的路径中。
在同一计算机上运行示例
请确保您可以使用浏览器通过输入以下地址访问服务:https://localhost/ServiceModelSamples/ServiceModelSample.ESCalculator.svc。在响应中应显示确认页。
从 \client\bin\(在语言特定文件夹内)中运行 Client.exe。客户端活动将显示在客户端控制台窗口上。
如果客户端与服务无法进行通信,请参见疑难解答指南。
提示
该示例生成一个控制台应用程序客户端程序。您必须使用命令提示启动它才能查看相应的输出。
跨计算机运行示例
在服务计算机上创建一个名为 ServiceModelSamples 的虚拟目录。虚拟目录设置说明包含的 Setupvroot.bat 脚本可用来创建磁盘目录和虚拟目录。
将 service\bin 目录中的 ESCalculator.dll 文件复制到服务计算机上的目录中。
在命令提示符下,定位到服务计算机上的目标目录。如果使用 Windows Vista 或 Windows Server 2008,请确保以管理员身份运行命令提示。
在服务计算机上输入 gacutil.exe /i ESCalculator.dll 以将该程序集添加到全局程序集缓存中。
在服务计算机上输入 regsvcs.exe ESCalculator.dll 以使用 COM+ 注册该程序集的组件和 ServiceModelSample 应用程序。
在服务计算机上输入 ComSvcConfig.exe /install /application:ServiceModelSample /contract:"ServiceModelSample.ESCalculator,ICalculator" /hosting:was /webDirectory:ServiceModelSamples /mex /verbose 以将该协定作为 IIS 承载的服务公开。
将 \client\bin\ 文件夹(在语言特定文件夹内)中的客户端程序文件复制到客户端计算机上。
在客户端配置文件中,更改终结点定义的地址值以与服务的新地址相匹配。在地址中将任何对“localhost”的引用替换为一个完全限定的域名。
确保可以使用浏览器从客户端计算机访问服务。
在客户端计算机上,在命令提示符下启动 Client.exe。
运行示例后进行清除
如果使用 Windows Vista 或 Windows Server 2008,请确保以管理员身份运行命令提示。输入 ComSvcConfig.exe /u /application:ServiceModelSample /contract:ServiceModelSample.ESCalculator,ICalculator 以卸载该 COM+ 集成。
输入 regsvcs.exe /u ESCalculator.dll 以从 COM+ 中卸载该应用程序。
输入 gacutil.exe /u ESCalculator 以从全局程序集缓存中移除该组件。
Send comments about this topic to Microsoft.
© 2007 Microsoft Corporation. All rights reserved.