如何:定义 Windows Communication Foundation 服务协定

这是创建基本 Windows Communication Foundation (WCF) 服务和可以调用该服务的客户端所需的六项任务中的第一项任务。有关全部六项任务的概述,请参见入门教程主题。

创建基本 WCF 服务时,第一项任务是定义协定。协定指定服务支持的操作。可以将操作视为一个 Web 服务方法。通过定义 C++、C# 或 Visual Basic (VB) 接口可创建协定。接口中的每个方法都对应于特定的服务操作。每个接口都必须将 ServiceContractAttribute 应用于自身,而每个操作都必须将 OperationContractAttribute 应用于自身。如果接口中的一个方法具有 ServiceContractAttribute 而没有 OperationContractAttribute,则不公开该方法。

在操作过程后面的示例中提供了用于此任务的代码。

使用接口创建 Windows Communication Foundation 协定

  1. 通过在**“开始”菜单中右击“Visual Studio 2010”并选择“以管理员身份运行”**,以管理员身份打开该程序。

  2. 创建新的控制台应用程序项目。单击**“文件”菜单,选择“新建”,然后选择“项目”。在“新建项目”对话框中,选择“Visual Basic”“Visual C#”,选择“控制台应用程序”模板,然后将其命名为 Service。使用默认的“位置”**。

  3. 对于 C# 项目,Visual Studio 会创建名为 Program.cs 的文件。此类会包含名为 Main() 的空方法。对于 VB 项目,Visual Studio 会创建名为 Module1.vb 的文件,其中包含名为 Main() 的空子例程。控制台应用程序项目需要这些方法才能正确生成,因此您可以放心地将这些方法保留在项目中。

  4. 将默认的 Service 命名空间更改为 Microsoft.ServiceModel.Samples。为此,请在**“解决方案资源管理器”中,右击项目,并选择“属性”。确保选择了“属性”对话框左侧的“应用程序”选项卡。对于 C# 项目,在标有“默认命名空间”的编辑框中键入 Microsoft.ServiceModel.Samples。对于 VB 项目,在标有“根命名空间”的编辑框中键入 Microsoft.ServiceModel.Samples。单击“文件”菜单,然后选择“全部保存”**以保存更改。

  5. 如果使用 C#,请在生成的 Program.cs 文件中将命名空间更改为 Microsoft.ServiceModel.Samples,如下面的示例所示。

    namespace Microsoft.ServiceModel.Samples 
    {
        class Program
        {
            static void Main(string[] args)
            {
            }
        }
    }
    

    如果使用 VB,请将 Namespace 语句和 End Namespace 语句添加到生成的 Module1.vb 中,如下面的示例所示。

    Namespace Microsoft.ServiceModel.Samples
        Module Module1
            Sub Main()
            End Sub
        End Module
    End Namespace
    
  6. 将对 System.ServiceModel.dll 的引用添加到项目:

    1. 在**“解决方案资源管理器”中,右击项目文件夹下的“引用”文件夹,然后选择“添加引用”**。

    2. 在**“添加引用”对话框中选择“.NET”选项卡,向下滚动屏幕,看到“System.ServiceModel”(版本 4.0.0.0)后,将其选中,然后单击“确定”**。

    ms731835.note(zh-cn,VS.100).gif注意:
    在使用命令行编译器(例如 Csc.exe 或 Vbc.exe)时,还必须提供程序集的路径。例如,默认情况下,在运行 Windows Vista 的计算机上,路径为:“Windows\Microsoft.NET\Framework\v4.0”。

  7. System.ServiceModel 命名空间添加一个 using 语句(在 Visual Basic 中为 Imports)。

    Imports System.ServiceModel
    
    using System.ServiceModel;
    
  8. 定义一个名为 ICalculator 的新接口,并向该接口应用 Namespace 值为“http://Microsoft.ServiceModel.Samples”的 ServiceContractAttribute 特性。显式指定命名空间是一种最佳做法,因为这样可防止将默认命名空间值添加到协定名称。

    ms731835.note(zh-cn,VS.100).gif注意:
    使用特性给接口或类添加批注时,可以从特性名称中去掉“Attribute”部分。因此 ServiceContractAttribute 在 C# 中为 [ServiceContract],在 Visual Basic 中为 <ServiceContract>

    <ServiceContract(Namespace:="http://Microsoft.ServiceModel.Samples")> _
    Public Interface ICalculator
    
    [ServiceContract(Namespace = "http://Microsoft.ServiceModel.Samples")]
    public interface ICalculator
    
  9. 在接口中为 ICalculator 协定公开的每个操作(加、减、乘和除)声明一个方法,并对希望作为公共 WCF 协定的一部分公开的每个方法应用 OperationContractAttribute 特性。

        <OperationContract()> _
    Function Add(ByVal n1 As Double, ByVal n2 As Double) As Double
        <OperationContract()> _
        Function Subtract(ByVal n1 As Double, ByVal n2 As Double) As Double
        <OperationContract()> _
        Function Multiply(ByVal n1 As Double, ByVal n2 As Double) As Double
        <OperationContract()> _
        Function Divide(ByVal n1 As Double, ByVal n2 As Double) As Double
    
    [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);
    

示例

下面的代码示例演示一个定义服务协定的基本接口。

Imports System
' Step 5: Add the Imports statement for the System.ServiceModel namespace
Imports System.ServiceModel

Namespace Microsoft.ServiceModel.Samples
    ' Step 6: 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
        <OperationContract()> _
        Function Subtract(ByVal n1 As Double, ByVal n2 As Double) As Double
        <OperationContract()> _
        Function Multiply(ByVal n1 As Double, ByVal n2 As Double) As Double
        <OperationContract()> _
        Function Divide(ByVal n1 As Double, ByVal n2 As Double) As Double
    End Interface
End Namespace
using System;
// Step 5: Add the using statement for the System.ServiceModel namespace
using System.ServiceModel;
namespace Microsoft.ServiceModel.Samples
{
  // Step 6: Define a service contract.
  [ServiceContract(Namespace = "http://Microsoft.ServiceModel.Samples")]
  public interface ICalculator
  {
    // Step7: Create the method declaration for the contract.
    [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);
  }
}

现在已创建接口,继续按照如何:实现 Windows Communication Foundation 服务协定中的说明实现该接口。有关疑难解答信息,请参见入门教程疑难解答

另请参见

任务

如何:实现 Windows Communication Foundation 服务协定
入门示例
自承载

参考

ServiceContractAttribute
OperationContractAttribute