使用 WCF 客户端访问服务
创建服务之后,下一步是创建 WCF 客户端代理。 客户端应用程序使用 WCF 客户端代理与服务进行通信。 客户端应用程序通常导入服务的元数据来生成可用来调用该服务的 WCF 客户端代码。
创建 WCF 客户端的基本步骤如下:
编译服务代码。
生成 WCF 客户端代理。
实例化 WCF 客户端代理。
可使用服务模块元数据实用工具 (SvcUtil.exe) 手动生成 WCF 客户端代理。有关详细信息,请参阅 ServiceModel 元数据实用工具 (Svcutil.exe)。 还可以使用“添加服务引用”功能在 Visual Studio 内生成 WCF 客户端代理。 若要使用上述两种方法中的一种生成 WCF 客户端代理,必须运行该服务。 如果服务是自承载服务,则必须运行主机。 如果服务是在 IIS/WAS 中承载的,则无需执行任何其他操作。
ServiceModel 元数据实用工具
ServiceModel 元数据实用工具 (Svcutil.exe) 是一个命令行工具,用于从元数据生成代码。 下面是一个基本 Svcutil.exe 命令示例。
Svcutil.exe <service's Metadata Exchange (MEX) address or HTTP GET address>
另外,还可以使用 Svcutil.exe 来处理文件系统中的 Web 服务描述语言 (WSDL) 和 XML 架构定义语言 (XSD) 文件。
Svcutil.exe <list of WSDL and XSD files on file system>
结果是一个包含 WCF 客户端代码的代码文件,客户端应用程序可以使用该客户端代码来调用服务。
您还可以使用该工具生成配置文件。
Svcutil.exe <file1 [,file2]>
如果仅提供了一个文件名,则该文件名是输出文件的名称。 如果提供了两个文件名,则第一个文件是输入配置文件,其内容将与生成的配置合并,然后写出到第二个文件中。 有关配置详细信息,请参阅为服务配置绑定。
重要
与任何未受保护的网络请求一样,未受保护的元数据请求也会带来一定的风险:如果您不能确定您正在与其进行通信的终结点身份属实,那么您检索的信息有可能是来自于恶意服务的元数据。
Visual Studio 中的“添加服务引用”功能
在服务运行的情况下,右键单击将包含 WCF 客户端代理的项目,然后选择“添加”>“服务引用”。 在“添加服务引用”对话框中,键入要调用的服务的 URL,然后单击“转到”按钮。 该对话框将显示在您指定的地址上提供的服务列表。 双击该服务可看到可用协定和操作,为生成的代码指定命名空间,然后单击“确定”按钮。
示例
下面的代码示例演示为服务创建的一个服务协定。
// Define a service contract.
[ServiceContract(Namespace="http://Microsoft.ServiceModel.Samples")]
public interface ICalculator
{
[OperationContract]
double Add(double n1, double n2);
// Other methods are not shown here.
}
' Define a service contract.
<ServiceContract(Namespace:="http://Microsoft.ServiceModel.Samples")> _
Public Interface ICalculator
<OperationContract()> _
Function Add(ByVal n1 As Double, ByVal n2 As Double) As Double
' Other methods are not shown here.
End Interface
ServiceModel 元数据实用工具以及 Visual Studio 中的“添加服务引用”生成以下 WCF 客户端类。 该类从 ClientBase<TChannel> 泛型类继承,并实现 ICalculator
接口。 该工具还生成 ICalculator
接口(此处未演示)。
public partial class CalculatorClient : System.ServiceModel.ClientBase<ICalculator>, ICalculator
{
public CalculatorClient()
{}
public CalculatorClient(string endpointConfigurationName) :
base(endpointConfigurationName)
{}
public CalculatorClient(string endpointConfigurationName, string remoteAddress) :
base(endpointConfigurationName, remoteAddress)
{}
public CalculatorClient(string endpointConfigurationName,
System.ServiceModel.EndpointAddress remoteAddress) :
base(endpointConfigurationName, remoteAddress)
{}
public CalculatorClient(System.ServiceModel.Channels.Binding binding,
System.ServiceModel.EndpointAddress remoteAddress) :
base(binding, remoteAddress)
{}
public double Add(double n1, double n2)
{
return base.Channel.Add(n1, n2);
}
}
Partial Public Class CalculatorClient
Inherits System.ServiceModel.ClientBase(Of ICalculator)
Implements ICalculator
Public Sub New()
MyBase.New
End Sub
Public Sub New(ByVal endpointConfigurationName As String)
MyBase.New(endpointConfigurationName)
End Sub
Public Sub New(ByVal endpointConfigurationName As String, ByVal remoteAddress As String)
MyBase.New(endpointConfigurationName, remoteAddress)
End Sub
Public Sub New(ByVal endpointConfigurationName As String,
ByVal remoteAddress As System.ServiceModel.EndpointAddress)
MyBase.New(endpointConfigurationName, remoteAddress)
End Sub
Public Sub New(ByVal binding As System.ServiceModel.Channels.Binding,
ByVal remoteAddress As System.ServiceModel.EndpointAddress)
MyBase.New(binding, remoteAddress)
End Sub
Public Function Add(ByVal n1 As Double, ByVal n2 As Double) As Double
Implements ICalculator.Add
Return MyBase.Channel.Add(n1, n2)
End Function
End Class
使用 WCF 客户端
要使用 WCF 客户端,请创建 WCF 客户端的实例,然后调用该实例的方法,如下面的代码所示。
// Create a client object with the given client endpoint configuration.
CalculatorClient calcClient = new CalculatorClient("CalculatorEndpoint");
// Call the Add service operation.
double value1 = 100.00D;
double value2 = 15.99D;
double result = calcClient.Add(value1, value2);
Console.WriteLine("Add({0},{1}) = {2}", value1, value2, result);
' Create a client object with the given client endpoint configuration.
Dim calcClient As CalculatorClient = _
New CalculatorClient("CalculatorEndpoint")
' Call the Add service operation.
Dim value1 As Double = 100.00D
Dim value2 As Double = 15.99D
Dim result As Double = calcClient.Add(value1, value2)
Console.WriteLine("Add({0},{1}) = {2}", value1, value2, result)
调试客户端引发的异常
WCF 客户端引发的许多异常都是由服务上的异常引起。 这些功能的示例包括:
SocketException: 现有连接被远程主机强行关闭。
CommunicationException: 基础连接意外关闭。
CommunicationObjectAbortedException: 套接字连接已中止。 这可能是由于处理消息时出错或远程主机超过接收超时或者潜在的网络资源问题导致的。
当发生这些类型的异常时,解决问题的最佳方式是在服务端启用跟踪并确定服务端发生了何种异常。 有关跟踪详细信息,请参阅跟踪和使用跟踪对应用程序进行故障排除。