ServiceContractAttribute 类

定义

指示接口或类在 Windows Communication Foundation (WCF) 应用程序中定义服务协定。

public ref class ServiceContractAttribute sealed : Attribute
[System.AttributeUsage(System.AttributeTargets.Class | System.AttributeTargets.Interface, AllowMultiple=false, Inherited=false)]
public sealed class ServiceContractAttribute : Attribute
[System.AttributeUsage(System.AttributeTargets.Class | System.AttributeTargets.Interface, Inherited=false)]
public sealed class ServiceContractAttribute : Attribute
[<System.AttributeUsage(System.AttributeTargets.Class | System.AttributeTargets.Interface, AllowMultiple=false, Inherited=false)>]
type ServiceContractAttribute = class
    inherit Attribute
[<System.AttributeUsage(System.AttributeTargets.Class | System.AttributeTargets.Interface, Inherited=false)>]
type ServiceContractAttribute = class
    inherit Attribute
Public NotInheritable Class ServiceContractAttribute
Inherits Attribute
继承
ServiceContractAttribute
属性

示例

下面的代码示例演示如何对接口应用 ServiceContractAttribute 以使用一个由 OperationContractAttribute 指示的服务方法来定义服务协定。 在这种情况下,所有消息的绑定需要的保护级别为 ProtectionLevel.EncryptAndSign

然后,该代码示例将在 SampleService 类上实现该协定。

using System;
using System.Collections.Generic;
using System.Net.Security;
using System.ServiceModel;
using System.Text;

namespace Microsoft.WCF.Documentation
{
  [ServiceContract(
    Namespace="http://microsoft.wcf.documentation",
    Name="SampleService",
    ProtectionLevel=ProtectionLevel.EncryptAndSign
  )]
  public interface ISampleService{
    [OperationContract]
    string SampleMethod(string msg);
  }

  class SampleService : ISampleService
  {
  #region ISampleService Members

  public string  SampleMethod(string msg)
  {
      return "The service greets you: " + msg;
  }

  #endregion
  }
}


Imports System.Collections.Generic
Imports System.Net.Security
Imports System.ServiceModel
Imports System.Text

Namespace Microsoft.WCF.Documentation
  <ServiceContract(Namespace:="http://microsoft.wcf.documentation", Name:="SampleService", ProtectionLevel:=ProtectionLevel.EncryptAndSign)> _
  Public Interface ISampleService
    <OperationContract> _
    Function SampleMethod(ByVal msg As String) As String
  End Interface

  Friend Class SampleService
      Implements ISampleService
  #Region "ISampleService Members"

  Public Function SampleMethod(ByVal msg As String) As String Implements ISampleService.SampleMethod
       Return "The service greets you: " & msg
  End Function

  #End Region
  End Class
End Namespace

下面的代码示例演示了上述服务(创建一个终结点)的简单配置文件。

<configuration>
  <system.serviceModel>
    <services>
      <service 
        name="Microsoft.WCF.Documentation.SampleService"
        behaviorConfiguration="mex"
      >
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8080/SampleService"/>
          </baseAddresses>
        </host>
        <endpoint
          address=""
          binding="wsHttpBinding"
          contract="Microsoft.WCF.Documentation.ISampleService"
         />
        <endpoint
          address="mex"
          binding="mexHttpBinding"
          contract="IMetadataExchange"
        />
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="mex">
          <serviceMetadata httpGetEnabled="true" httpGetUrl=""/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>

下面的代码示例演示调用上述 SampleService 的简单客户端。

using System;
using System.ServiceModel;
using System.ServiceModel.Channels;

public class Client
{
  public static void Main()
  {
    // Picks up configuration from the config file.
    SampleServiceClient wcfClient = new SampleServiceClient();
    try
    {
        // Making calls.
        Console.WriteLine("Enter the greeting to send: ");
        string greeting = Console.ReadLine();
        Console.WriteLine("The service responded: " + wcfClient.SampleMethod(greeting));

        Console.WriteLine("Press ENTER to exit:");
        Console.ReadLine();

        // Done with service.
        wcfClient.Close();
        Console.WriteLine("Done!");
    }
    catch (TimeoutException timeProblem)
    {
      Console.WriteLine("The service operation timed out. " + timeProblem.Message);
      wcfClient.Abort();
      Console.Read();
    }
    catch(CommunicationException commProblem)
    {
      Console.WriteLine("There was a communication problem. " + commProblem.Message);
      wcfClient.Abort();
      Console.Read();
    }
  }
}


Imports System.ServiceModel
Imports System.ServiceModel.Channels

Public Class Client
  Public Shared Sub Main()
    ' Picks up configuration from the config file.
    Dim wcfClient As New SampleServiceClient()
    Try
        ' Making calls.
        Console.WriteLine("Enter the greeting to send: ")
            Dim greeting = Console.ReadLine()
        Console.WriteLine("The service responded: " & wcfClient.SampleMethod(greeting))

        Console.WriteLine("Press ENTER to exit:")
        Console.ReadLine()

        ' Done with service. 
        wcfClient.Close()
        Console.WriteLine("Done!")
    Catch timeProblem As TimeoutException
      Console.WriteLine("The service operation timed out. " & timeProblem.Message)
      wcfClient.Abort()
      Console.Read()
    Catch commProblem As CommunicationException
      Console.WriteLine("There was a communication problem. " & commProblem.Message)
      wcfClient.Abort()
      Console.Read()
    End Try
  End Sub
End Class

注解

使用接口(或类)上的 ServiceContractAttribute 属性定义服务协定。 然后使用一个或多个类(或接口)方法中的 OperationContractAttribute 属性定义协定的服务操作。 当服务协定实现并与 绑定EndpointAddress 对象组合时,服务协定将公开供客户端使用。 有关使用简单示例的过程的概述,请参阅入门教程。 有关创建服务协定的详细信息,请参阅 设计和实现服务

此信息由 ServiceContractAttribute 表示,其接口与 Web 服务描述语言 (WSDL) <portType> 元素松散相关。 服务协定在服务端用于指定服务终结点向调用方公开的内容。 它也可以在客户端使用,以指定客户端与终结点通信的协定,如果是双工协定,则用于指定客户端必须实现的回调协定(使用 CallbackContract 属性)以参与双工对话。

备注

使用 ServiceContractAttribute 修饰的接口或类还必须至少拥有一个用 OperationContractAttribute 属性标记的方法以公开任意功能。 有关使用这两个属性定义和实现服务的最简单用法的代码示例,请参见“示例”部分。

使用 ServiceContractAttribute 属性修改服务协定。

服务实现服务协定,此协定表示服务类型支持的数据交换。 服务类可以实现服务协定(通过实现以 ServiceContractAttribute 标记的接口,该接口具有以 OperationContractAttribute 标记的方法),或者也可以使用 ServiceContractAttribute 标记并将 OperationContractAttribute 属性应用到它自己的方法中。 (如果类实现标记 ServiceContractAttribute的接口,则不能使用 ServiceContractAttribute.) 方法标记服务类型的服务类型 OperationContractAttribute ,这些方法被视为由服务类型本身指定的默认服务协定的一部分。 有关服务操作的详细信息,请参见 OperationContractAttribute

默认情况下,NameNamespace 属性分别是协定类型的名称和 http://tempuri.org,且 ProtectionLevelProtectionLevel.None。 建议服务协定使用这些属性显式设置其名称、命名空间和保护级别。 这样做可以实现两个目的。 首先,它将生成一个并不直接与托管的类型信息连接的协定,从而使你可以重构托管代码和命名空间而不破坏协定,这是因为协定使用 WSDL 表示。 其次,显式要求协定本身具有特定保护级别将使运行时能够验证绑定配置是否支持该安全级别,从而防止因配置不当而公开敏感信息。 有关保护级别的详细信息,请参阅 了解保护级别

若要公开供客户端应用程序使用的服务,请创建一个主机应用程序,将服务终结点注册到 Windows Communication Foundation (WCF) 。 可以在控制台应用程序、Windows服务应用程序、ASP.NET 应用程序、Windows 窗体应用程序或任何其他应用程序域中使用Windows激活服务 (WAS) 托管 WCF 服务。

在 WAS 中承载与创建 ASP.NET 应用程序非常类似。 有关详细信息,请参阅 如何:在 IIS 中托管 WCF 服务

客户端既可以使用服务协定接口(使用 ServiceContractAttribute 标记的接口)创建服务的信道,也可以使用客户端对象(这些对象将服务协定接口的类型信息与 ClientBase<TChannel> 类相结合)与您的服务通信。 有关服务客户端通道的详细信息,请参阅 ChannelFactory<TChannel> 类和 WCF 客户端概述

使用 ServiceContractAttribute 类或接口从另一个 ServiceContractAttribute 类或接口继承将会扩展其父协定。 例如,如果 IChildContract 接口使用 ServiceContractAttribute 标记并且是从另一个服务协定接口 IParentContract 继承的,则 IChildContract 服务协定将包含 IParentContractIChildContract 的方法。 扩展协定(无论在类或接口上)与扩展托管类和接口非常类似。

创建服务最灵活的方法是先定义服务协定接口,然后再让服务类实现该接口。 (如果必须实现由其他服务定义的服务协定,) 直接生成服务,方法是在 ServiceContractAttribute 服务仅公开一个协定 (但该协定可由多个终结点) 公开时使用 OperationContractAttribute 其方法来直接生成服务。

使用 CallbackContract 属性指示另一个服务协定,当与原始服务协定绑定时,可以单独定义可以以两种方式流动的消息交换。 有关详细信息,请参阅 CallbackContract

构造函数

ServiceContractAttribute()

初始化 ServiceContractAttribute 类的新实例。

属性

CallbackContract

获取或设置当协定为双工协定时的回调协定类型。

ConfigurationName

获取或设置用于查找应用程序配置文件中的服务的名称。

HasProtectionLevel

获取一个值,该值指示是否对成员分配保护级别。

Name

获取或设置 Web 服务描述语言 (WSDL) 中的 <portType> 元素的名称。

Namespace

获取或设置 Web 服务描述语言 (WSDL) 中的 <portType> 元素的命名空间。

ProtectionLevel

指定协定的绑定是否必须支持 ProtectionLevel 属性的值。

SessionMode

获取或设置是否允许、不允许或要求会话。

TypeId

在派生类中实现时,获取此 Attribute 的唯一标识符。

(继承自 Attribute)

方法

Equals(Object)

返回一个值,该值指示此实例是否与指定的对象相等。

(继承自 Attribute)
GetHashCode()

返回此实例的哈希代码。

(继承自 Attribute)
GetType()

获取当前实例的 Type

(继承自 Object)
IsDefaultAttribute()

在派生类中重写时,指示此实例的值是否是派生类的默认值。

(继承自 Attribute)
Match(Object)

当在派生类中重写时,返回一个指示此实例是否等于指定对象的值。

(继承自 Attribute)
MemberwiseClone()

创建当前 Object 的浅表副本。

(继承自 Object)
ToString()

返回表示当前对象的字符串。

(继承自 Object)

显式接口实现

_Attribute.GetIDsOfNames(Guid, IntPtr, UInt32, UInt32, IntPtr)

将一组名称映射为对应的一组调度标识符。

(继承自 Attribute)
_Attribute.GetTypeInfo(UInt32, UInt32, IntPtr)

检索对象的类型信息,然后可以使用该信息获取接口的类型信息。

(继承自 Attribute)
_Attribute.GetTypeInfoCount(UInt32)

检索对象提供的类型信息接口的数量(0 或 1)。

(继承自 Attribute)
_Attribute.Invoke(UInt32, Guid, UInt32, Int16, IntPtr, IntPtr, IntPtr, IntPtr)

提供对某一对象公开的属性和方法的访问。

(继承自 Attribute)

适用于

另请参阅