本示例演示如何将来自 COM+ 应用程序的接口作为 Windows Communication Foundation (WCF) 服务公开以及如何从 WCF 客户端调用此服务。本示例由客户端控制台程序 (.exe) 和在 COM+ 内注册的企业服务库应用程序 (.dll) 组成。本示例基于实现计算器服务的 入门示例 示例,与 COM+ 集成:Web 承载 示例类似。通过使用 COM+ 承载和 TCP 传输,本示例演示一种性能比 COM+ 集成:Web 承载 示例中的方法更高的方法,但是要求 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);
}
此接口作为定义请求-答复通信模式的服务协定公开。客户端向数学运算发出同步请求,服务和基础组件使用结果进行回复。客户端活动显示在控制台窗口中。
使用 COM+ 在进程内承载服务;必须手工启动应用程序 ServiceModelHostedSample
来激活服务终结点。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:ServiceModelHostedSample /contract:"ServiceModelHostedSample.ESCalculator,ICalculator" /hosting:complus /mex /verbose
在本例中,该工具为 ServiceModelHostedSample.ESCalculator
组件的 ICalculator
接口添加服务,该组件位于 ServiceModelHostedSample
应用程序中。在 COM+ 中承载该服务,并使用元数据交换终结点。将一个 ServiceModelInitializer
组件添加到应用程序以协助集成,并在 COM+ 应用程序的应用程序根目录中生成一个应用程序配置文件,对于此应用程序而言,该文件为“%PROGRAMFILES%\ComPlus Applications\{4cdcdb2c-0b19-4534-95cd-fbbff4d67dd9}\”。在应用程序启动时,ServiceModelInitializer
组件会检查应用程序配置文件并启动进行了适当配置的服务终结点。
对于 COM+ 承载的服务,COM+ Service Model Configuration Tool (ComSvcConfig.exe) 工具使用只提供同一计算机访问的 netNamedPipeBinding 创建服务终结点。必须进一步编辑该配置文件以在其他传输上提供终结点。本示例使用自定义配置文件,该配置文件通过使用 netTcpBinding 和 wsHttpBinding 绑定在 TCP 和 HTTP 上公开应用程序:
<!-- Specify the service (application and component GUIDs) and service and MEX endpoints -->
<services>
<service behaviorConfiguration="ComServiceMexBehavior"
name="{4CDCDB2C-0B19-4534-95CD-FBBFF4D67DD9},{C2B84940-AD54-4A44-B5F7-928130980AB9}">
<endpoint
address="ICalculator"
binding="netTcpBinding"
bindingConfiguration="comNonTransactionalBinding"
contract="{8803CCEC-4DFB-49a7-925B-60025C32E5CD}" />
<endpoint
address="ICalculator"
binding="wsHttpBinding"
bindingConfiguration="comNonTransactionalBinding"
contract="{8803CCEC-4DFB-49a7-925B-60025C32E5CD}" />
<endpoint
address="mex"
binding="mexHttpBinding"
contract="IMetadataExchange" />
<host>
<!-- Specify base addresses for both transports -->
<baseAddresses>
<add baseAddress="net.tcp://localhost:8081/ServiceModelHostedSample" />
<add baseAddress="https://localhost:8082/ServiceModelHostedSample" />
</baseAddresses>
</host>
</service>
</services>
在本示例中,配置文件还自定义服务的名称和命名空间,并可以用于只公开由组件提供的一个运算子集。在本例中,Divide 方法已被注释掉,并从所公开的服务协定中省略:
<!-- comContract specifying the name, namespace and methods for the service -->
<comContracts>
<comContract
contract="{8803CCEC-4DFB-49a7-925B-60025C32E5CD}"
name="ICalculator"
namespace="https://microsoft.com/Microsoft.ServiceModel.Samples/EnterpriseServicesHosted"
requiresSession="true">
<exposedMethods>
<add exposedMethod="Add" />
<add exposedMethod="Subtract" />
<add exposedMethod="Multiply" />
<!-- <add exposedMethod="Divide" /> -->
</exposedMethods>
</comContract>
</comContracts>
客户端使用由Service Metadata Utility Tool (Svcutil.exe) 生成的客户端在协定上通信。客户端已包含在 generatedClient.cs 文件中,在 App.config 中有兼容的配置。该实用工具检索服务的元数据并生成用于在协定类型上通信的客户端。必须可以使用承载服务生成客户端代码,因为承载服务用于检索服务元数据。在客户端目录中通过命令提示符运行以下命令以生成类型化代理:
svcutil.exe /n:http://Microsoft.ServiceModel.Samples,Microsoft.ServiceModel.Samples https://localhost:8082/ServiceModelHostedSample/mex /out:generatedClient.cs /config:App.config
客户端实现使用 TCP 绑定配置构造生成的客户端的实例。然后可以使用该实例开始与服务通信。
// Create a client.
CalculatorClient client = new CalculatorClient("NetTcpBinding_ICalculator ");
WSHttpBinding_ICalculator
// 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);
//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
Press <ENTER> to terminate client.
设置和生成示例
若要生成 C# 或 Visual Basic .NET 版本的解决方案,请按照生成 Windows Communication Foundation 示例中的说明进行操作。生成进程包括执行一个脚本,该脚本创建 COM+ 应用程序并将其标记为“Leave running when idle”(空闲时保持运行),这可防止服务终结点由于处于非活动状态而被自动关闭。
在命令提示符下,定位到示例的 service\bin 文件夹。如果使用 Windows Vista 或 Windows Server 2008,请确保以管理员身份运行命令提示。
输入 gacutil.exe /i ESCalculatorHosted.dll 以将该程序集添加到全局程序集缓存 (GAC) 中。确保 Gacutil.exe 在您的路径中。
输入 regsvcs.exe ESCalculatorHosted.dll 以使用 COM+ 注册该程序集的组件和 ServiceModelSample 应用程序。确保 Regsvcs.exe 在您的路径中。
输入 ComSvcConfig.exe /install /application:ServiceModelHostedSample /contract:"ServiceModelHostedSample.ESCalculator,ICalculator" /hosting:complus /mex /verbose 以将该接口作为 Internet 信息服务 (IIS) 承载的服务公开。确保 ComSvcConfig.exe 在您的路径中。
若要用本示例的自定义配置来替换默认配置,请将 Service/application.config 文件复制到 %ProgramFiles%\ComPlus Applications\{4cdcdb2c-0b19-4534-95cd-fbbff4d67dd9}\ 目录。
在同一计算机上运行示例
若要使用组件服务管理控制台启动此应用程序和终结点,请右键单击 ServiceModelHostedSample 并选择“启动”。
通过输入以下地址测试您是否可以使用浏览器访问该服务:https://localhost:8082/ServiceModelHostedSample。在响应中应显示确认页。
从 \client\bin\(在语言特定文件夹内)中运行 Client.exe。客户端活动将显示在客户端控制台窗口上。
如果客户端与服务无法进行通信,请参见疑难解答指南。
提示
该示例生成一个控制台应用程序客户端程序。您必须使用命令提示启动它才能查看相应的输出。
跨计算机运行示例
将 service\bin 目录中的 ESCalculatorHosted.dll 文件和服务目录的 CreateAppLeaveRunning.vbs 文件复制到服务计算机上的目录中。
在命令提示符下,定位到服务计算机上的目标目录。如果使用 Windows Vista 或 Windows Server 2008,请确保以管理员身份运行命令提示。
执行 CreateAppLeaveRunning.vbs 脚本以创建具有“Leave running when idle”(空闲时保持运行)设置的 COM+ 应用程序。
输入 gacutil.exe /i ESCalculatorHosted.dll 以将该程序集添加到全局程序集缓存 (GAC) 中。确保 Gacutil.exe 在您的路径中。
输入 regsvcs.exe ESCalculatorHosted.dll 以使用 COM+ 注册该程序集的组件和 ServiceModelSample 应用程序。确保 Regsvcs.exe 在您的路径中。
输入 ComSvcConfig.exe /install /application:ServiceModelHostedSample /contract:"ServiceModelHostedSample.ESCalculator,ICalculator" /hosting:complus /mex /verbose 以将该接口作为 IIS 承载的服务公开。确保 ComSvcConfig.exe 在您的路径中。
若要用本示例的自定义配置来替换默认配置,请将 Service/application.config 文件复制到 %ProgramFiles%\ComPlus Applications\{4cdcdb2c-0b19-4534-95cd-fbbff4d67dd9}\ 目录。
在服务应用程序配置文件中,更改终结点定义的地址值以与服务的新地址匹配。在地址中将任何对“localhost”的引用替换为一个完全限定的域名。
若要使用组件服务管理控制台启动此应用程序和终结点,请右键单击 ServiceModelHostedSample 并选择“启动”。
将 \client\bin\ 文件夹(在语言特定文件夹内)中的客户端程序文件复制到客户端计算机上。
如果服务未在域帐户下运行,请打开客户端配置文件并更改终结点定义的地址值以与服务的新地址相匹配。在地址中将任何对“localhost”的引用替换为一个完全限定的域名。如果服务正在域帐户下运行,则通过针对服务运行 Svcutil.exe 来重新生成客户端配置。使用生成的文件来代替示例中的配置文件。生成的配置文件有附加的标识信息(并包含连接到服务终结点所需的所有设置,即使这些设置是默认设置)。
测试是否可使用浏览器从客户端计算机访问服务。
在客户端计算机上,在命令提示符下启动 Client.exe。
运行示例后进行清除
- 出于安全目的,请在完成该示例时将 ESCalculatorHosted 组件从全局程序集缓存中移除,删除 ServiceModelHostedSample COM+ 应用程序并移除应用程序根目录 %PROGRAMFILES%\ComPlus Applications\{4cdcdb2c-0b19-4534-95cd-fbbff4d67dd9}\。
Send comments about this topic to Microsoft.
© 2007 Microsoft Corporation. All rights reserved.