使用 WCF 客户端访问服务

创建服务之后,下一步是创建 WCF 客户端。客户端应用程序使用 WCF 客户端与服务进行通信。客户端应用程序通常导入服务的元数据来生成可用来调用该服务的 WCF 客户端代码。

创建 WCF 客户端的基本步骤包括:

  1. 编译服务代码。
  2. 使用 ServiceModel Metadata Utility Tool (SvcUtil.exe) 创建 WCF 客户端。

ServiceModel 元数据实用工具

ServiceModel Metadata Utility Tool (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]>

如果仅提供了一个文件名,则该文件名是输出文件的名称。如果提供了两个文件名,则第一个文件是输入配置文件,其内容将与生成的配置合并,然后写出到第二个文件中。有关 配置的更多信息,请参见为 Windows Communication Foundation 服务配置绑定

提示

与任何未受保护的网络请求一样,未受保护的元数据请求也会带来一定的风险:如果您不能确定您正在与其进行通信的终结点身份属实,那么您检索的信息有可能是来自于恶意服务的元数据。

示例

下面的代码示例演示为服务创建的一个服务协定。

// 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 元数据实用工具生成以下 WCF 客户端类。该类从 ClientBase 泛型类继承,并实现 ICalculator 接口。该工具还生成 ICalculator 接口(此处未演示)。

public partial class CalculatorClient : System.ServiceModel.ClientBase<ICalculator>, ICalculator
{
    public CalculatorClient(){}
    
    public CalculatorClient(string configurationName) : 
            base(configurationName)
    {}
    
    public CalculatorClient(System.ServiceModel.Binding binding) : 
            base(binding)
    {}
    
    public CalculatorClient(System.ServiceModel.EndpointAddress address,
    System.ServiceModel.Binding binding) : 
            base(address, binding)
    {}
    
    public double Add(double n1, double n2)
    {
        return base.InnerChannel.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 configurationName As String)
        MyBase.New(configurationName)
    End Sub
    
    Public Sub New(ByVal binding As System.ServiceModel.Binding)
        MyBase.New(binding)
    End Sub
    
    Public Sub New(ByVal address As _
    System.ServiceModel.EndpointAddress, _
    ByVal binding As System.ServiceModel.Binding)
        MyBase.New(address, binding)
    End Sub
    
    Public Function Add(ByVal n1 As Double, ByVal n2 As Double) As _
    Double Implements ICalculator.Add
        Return MyBase.InnerChannel.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 客户端所引发的许多异常是由服务上的异常所导致的。以下是这种情况的一些示例:

当发生这些类型的异常时,解决问题的最佳方式是在服务端启用跟踪并确定服务端发生了何种异常。跟踪的更多信息,请参见跟踪使用跟踪来排除应用程序故障

另请参见

任务

如何:创建 Windows Communication Foundation 客户端
如何:使用双工协定访问服务
如何:以异步方式调用 WCF 服务操作
如何:使用单向和请求-答复协定访问 WCF 服务
如何:使用 WCF 客户端访问 WSE 3.0 服务
如何:使用 XmlSerializer 改善 WCF 客户端应用程序的启动时间

概念

了解生成的客户端代码
指定客户端运行时行为
配置客户端行为