MessageContractAttribute MessageContractAttribute MessageContractAttribute MessageContractAttribute Class

定义

定义与 SOAP 消息相对应的强类型类。Defines a strongly-typed class that corresponds to a SOAP message.

public ref class MessageContractAttribute sealed : Attribute
[System.AttributeUsage(System.AttributeTargets.Class | System.AttributeTargets.Struct)]
[System.AttributeUsage(System.AttributeTargets.Class | System.AttributeTargets.Struct, AllowMultiple=false)]
public sealed class MessageContractAttribute : Attribute
type MessageContractAttribute = class
    inherit Attribute
Public NotInheritable Class MessageContractAttribute
Inherits Attribute
继承
MessageContractAttributeMessageContractAttributeMessageContractAttributeMessageContractAttribute
属性

示例

下面的代码示例演示如何使用 MessageContractAttribute 来控制请求消息和响应消息的 SOAP 信封结构,以及如何使用 MessageHeaderAttribute(创建响应消息的 SOAP 标头)和 MessageBodyMemberAttribute(指定请求消息和响应消息的正文)。The following code example shows the use of the MessageContractAttribute to control the SOAP envelope structure for both the request message and the response message, and the use of both the MessageHeaderAttribute (to create a SOAP header for the response message) and the MessageBodyMemberAttribute (to specify the bodies of both the request and response message). 此代码示例包含发送时的每个消息的示例。The code example contains an example of each message when sent.

using System;
using System.Collections.Generic;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Channels;

namespace Microsoft.WCF.Documentation
{
  [ServiceContract(Namespace = "Microsoft.WCF.Documentation")]
  interface IMessagingHello
  {
    [OperationContract(
     Action = "http://GreetingMessage/Action",
     ReplyAction = "http://HelloResponseMessage/Action"
    )]
    HelloResponseMessage Hello(HelloGreetingMessage msg);
  }

  [MessageContract]
  public class HelloResponseMessage
  {
    private string localResponse = String.Empty;
    private string extra = String.Empty;

    [MessageBodyMember(
      Name = "ResponseToGreeting",
      Namespace = "http://www.examples.com")]
    public string Response
    {
      get { return localResponse; }
      set { localResponse = value; }
    }

    [MessageHeader(
      Name = "OutOfBandData",
      Namespace = "http://www.examples.com",
      MustUnderstand=true
    )]
    public string ExtraValues
    {
      get { return extra; }
      set { this.extra = value; }
   }

   /*
    The following is the response message, edited for clarity.
    
    <s:Envelope>
      <s:Header>
        <a:Action s:mustUnderstand="1">http://HelloResponseMessage/Action</a:Action>
        <h:OutOfBandData s:mustUnderstand="1" xmlns:h="http://www.examples.com">Served by object 13804354.</h:OutOfBandData>
      </s:Header>
      <s:Body>
        <HelloResponseMessage xmlns="Microsoft.WCF.Documentation">
          <ResponseToGreeting xmlns="http://www.examples.com">Service received: Hello.</ResponseToGreeting>
        </HelloResponseMessage>
      </s:Body>    
    </s:Envelope>
    */
 }
  [MessageContract]
  public class HelloGreetingMessage
  {
    private string localGreeting;

    [MessageBodyMember(
      Name = "Salutations", 
      Namespace = "http://www.examples.com"
    )]
    public string Greeting
    {
      get { return localGreeting; }
      set { localGreeting = value; }
    }
  }

  /*
   The following is the request message, edited for clarity.
    
    <s:Envelope>
      <s:Header>
        <!-- Note: Some header content has been removed for clarity.
        <a:Action>http://GreetingMessage/Action</a:Action> 
        <a:To s:mustUnderstand="1"></a:To>
      </s:Header>
      <s:Body u:Id="_0" xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
        <HelloGreetingMessage xmlns="Microsoft.WCF.Documentation">
          <Salutations xmlns="http://www.examples.com">Hello.</Salutations>
        </HelloGreetingMessage>
      </s:Body>
   </s:Envelope>
   */

  class MessagingHello : IMessagingHello
  {
    public HelloResponseMessage Hello(HelloGreetingMessage msg)
    {
      Console.WriteLine("Caller sent: " + msg.Greeting);
      HelloResponseMessage responseMsg = new HelloResponseMessage();
      responseMsg.Response = "Service received: " + msg.Greeting;
      responseMsg.ExtraValues = String.Format("Served by object {0}.", this.GetHashCode().ToString());
      Console.WriteLine("Returned response message.");
      return responseMsg;
    }
  }
}
Imports System.Runtime.Serialization
Imports System.ServiceModel
Imports System.ServiceModel.Channels

Namespace Microsoft.WCF.Documentation
  <ServiceContract(Namespace := "Microsoft.WCF.Documentation")> _
  Friend Interface IMessagingHello
	<OperationContract(Action := "http://GreetingMessage/Action", ReplyAction := "http://HelloResponseMessage/Action")> _
	Function Hello(ByVal msg As HelloGreetingMessage) As HelloResponseMessage
  End Interface

  <MessageContract> _
  Public Class HelloResponseMessage
	Private localResponse As String = String.Empty
	Private extra As String = String.Empty

	<MessageBodyMember(Name := "ResponseToGreeting", Namespace := "http://www.examples.com")> _
	Public Property Response() As String
	  Get
		  Return localResponse
	  End Get
	  Set(ByVal value As String)
		  localResponse = value
	  End Set
	End Property

	<MessageHeader(Name := "OutOfBandData", Namespace := "http://www.examples.com", MustUnderstand:=True)> _
	Public Property ExtraValues() As String
	  Get
		  Return extra
	  End Get
	  Set(ByVal value As String)
		  Me.extra = value
	  End Set
	End Property

'   
'    The following is the response message, edited for clarity.
'    
'    <s:Envelope>
'      <s:Header>
'        <a:Action s:mustUnderstand="1">http://HelloResponseMessage/Action</a:Action>
'        <h:OutOfBandData s:mustUnderstand="1" xmlns:h="http://www.examples.com">Served by object 13804354.</h:OutOfBandData>
'      </s:Header>
'      <s:Body>
'        <HelloResponseMessage xmlns="Microsoft.WCF.Documentation">
'          <ResponseToGreeting xmlns="http://www.examples.com">Service received: Hello.</ResponseToGreeting>
'      </s:Body>    
'    </s:Envelope>
'    
  End Class
  <MessageContract> _
  Public Class HelloGreetingMessage
	Private localGreeting As String

	<MessageBodyMember(Name := "Salutations", Namespace := "http://www.examples.com")> _
	Public Property Greeting() As String
	  Get
		  Return localGreeting
	  End Get
	  Set(ByVal value As String)
		  localGreeting = value
	  End Set
	End Property
  End Class

'  
'   The following is the request message, edited for clarity.
'    
'    <s:Envelope>
'      <s:Header>
'        <!-- Note: Some header content has been removed for clarity.
'        <a:Action>http://GreetingMessage/Action</a:Action> 
'        <a:To s:mustUnderstand="1"></a:To>
'      </s:Header>
'      <s:Body u:Id="_0" xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
'        <HelloGreetingMessage xmlns="Microsoft.WCF.Documentation">
'          <Salutations xmlns="http://www.examples.com">Hello.</Salutations>
'      </s:Body>
'   </s:Envelope>
'   

  Friend Class MessagingHello
	  Implements IMessagingHello
	Public Function Hello(ByVal msg As HelloGreetingMessage) As HelloResponseMessage Implements IMessagingHello.Hello
	  Console.WriteLine("Caller sent: " & msg.Greeting)
	  Dim responseMsg As New HelloResponseMessage()
	  responseMsg.Response = "Service received: " & msg.Greeting
	  responseMsg.ExtraValues = String.Format("Served by object {0}.", Me.GetHashCode().ToString())
	  Console.WriteLine("Returned response message.")
	  Return responseMsg
	End Function
  End Class
End Namespace

注解

使用 MessageContractAttribute 属性为特定消息指定 SOAP 信封的结构。Use the MessageContractAttribute attribute to specify the structure of the SOAP envelope for a particular message. 然后服务就可以在服务操作中使用消息作为参数或返回类型。Your service can then use the message as a parameter or return type in service operations. 有关不修改默认 SOAP 信封本身的情况下控制 SOAP 正文内容序列化的信息,请参阅System.Runtime.Serialization.DataContractAttributeSpecifying Data Transfer in Service Contracts,和使用数据协定For information about controlling the serialization of the contents of a SOAP body without modifying the default SOAP envelope itself, see System.Runtime.Serialization.DataContractAttribute, Specifying Data Transfer in Service Contracts, and Using Data Contracts.

备注

您不能在具有常规可序列化参数的服务操作中使用自定义消息类型。You cannot use custom message types in your service operation with regular serializable parameters. 使用自定义消息类型或序列化参数,该参数不是 Message 对象。Either use custom message types or serializable parameters that are not Message objects. 有关详细信息,请参阅, Specifying Data Transfer in Service ContractsFor details, see , Specifying Data Transfer in Service Contracts.

要针对某一类型实施消息协定,请使用 MessageContractAttribute 对其进行批注,并使用 MessageBodyMemberAttributeMessageHeaderAttributeMessageHeaderArrayAttribute 对一个或多个类的字段或属性进行批注。To implement a message contract for a type, annotate it with MessageContractAttribute and annotate one or more of the class's fields or properties with MessageBodyMemberAttribute, MessageHeaderAttribute, or MessageHeaderArrayAttribute.

备注

System.ServiceModel.MessageParameterAttribute 不是消息协定属性,不能与 MessageContractAttribute 结合使用。System.ServiceModel.MessageParameterAttribute is not a message contract attribute and cannot be used in conjunction with MessageContractAttribute.

使用 ActionReplyAction 属性来指定 SOAP 消息中 <Action> 元素的值。Use the Action and ReplyAction properties to specify the value of the <Action> element in the SOAP message.

  • 使用 HasProtectionLevelProtectionLevel 属性来指示 SOAP 消息类型使用拥有保护级别,如果有,该保护级别是什么。Use the HasProtectionLevel and ProtectionLevel properties to indicate whether the SOAP message type has a protection level, and if so, what it is.

  • 使用 IsWrapped 属性来指示消息正文是否有包装元素,如果有,请使用 WrapperNameWrapperNamespace 属性分别指定包装元素的名称和命名空间。Use the IsWrapped property to indicate whether the message body has a wrapper element, and if so, use the WrapperName and WrapperNamespace properties to specify the name and namespace, respectively, of the wrapping element.

有关详细信息,请参阅Using Message ContractsFor more information, see Using Message Contracts.

构造函数

MessageContractAttribute() MessageContractAttribute() MessageContractAttribute() MessageContractAttribute()

初始化 MessageContractAttribute 类的新实例。Initializes a new instance of the MessageContractAttribute class.

属性

HasProtectionLevel HasProtectionLevel HasProtectionLevel HasProtectionLevel

获取一个值,该值指示消息是否有保护级别。Gets a value that indicates whether the message has a protection level.

IsWrapped IsWrapped IsWrapped IsWrapped

获取或设置一个值,该值指定消息正文是否有包装元素。Gets or sets a value that specifies whether the message body has a wrapper element.

ProtectionLevel ProtectionLevel ProtectionLevel ProtectionLevel

获取或设置一个值,该值指定是否对消息进行加密、签名或同时执行这两种操作。Gets or sets a value that specified whether the message must be encrypted, signed, or both.

TypeId TypeId TypeId TypeId

在派生类中实现时,获取此 Attribute 的唯一标识符。When implemented in a derived class, gets a unique identifier for this Attribute.

(Inherited from Attribute)
WrapperName WrapperName WrapperName WrapperName

获取或设置消息正文的包装元素名称。Gets or sets the name of the wrapper element of the message body.

WrapperNamespace WrapperNamespace WrapperNamespace WrapperNamespace

获取或设置消息正文包装元素的命名空间。Gets or sets the namespace of the message body wrapper element.

方法

Equals(Object) Equals(Object) Equals(Object) Equals(Object)

返回一个值,该值指示此实例是否与指定的对象相等。Returns a value that indicates whether this instance is equal to a specified object.

(Inherited from Attribute)
GetHashCode() GetHashCode() GetHashCode() GetHashCode()

返回此实例的哈希代码。Returns the hash code for this instance.

(Inherited from Attribute)
GetType() GetType() GetType() GetType()

获取当前实例的 TypeGets the Type of the current instance.

(Inherited from Object)
IsDefaultAttribute() IsDefaultAttribute() IsDefaultAttribute() IsDefaultAttribute()

在派生类中重写时,指示此实例的值是否是派生类的默认值。When overridden in a derived class, indicates whether the value of this instance is the default value for the derived class.

(Inherited from Attribute)
Match(Object) Match(Object) Match(Object) Match(Object)

当在派生类中重写时,返回一个指示此实例是否等于指定对象的值。When overridden in a derived class, returns a value that indicates whether this instance equals a specified object.

(Inherited from Attribute)
MemberwiseClone() MemberwiseClone() MemberwiseClone() MemberwiseClone()

创建当前 Object 的浅表副本。Creates a shallow copy of the current Object.

(Inherited from Object)
ToString() ToString() ToString() ToString()

返回表示当前对象的字符串。Returns a string that represents the current object.

(Inherited from Object)

显式界面实现

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

将一组名称映射为对应的一组调度标识符。Maps a set of names to a corresponding set of dispatch identifiers.

(Inherited from Attribute)
_Attribute.GetTypeInfo(UInt32, UInt32, IntPtr) _Attribute.GetTypeInfo(UInt32, UInt32, IntPtr) _Attribute.GetTypeInfo(UInt32, UInt32, IntPtr) _Attribute.GetTypeInfo(UInt32, UInt32, IntPtr)

检索对象的类型信息,然后可以使用该信息获取接口的类型信息。Retrieves the type information for an object, which can be used to get the type information for an interface.

(Inherited from Attribute)
_Attribute.GetTypeInfoCount(UInt32) _Attribute.GetTypeInfoCount(UInt32) _Attribute.GetTypeInfoCount(UInt32) _Attribute.GetTypeInfoCount(UInt32)

检索对象提供的类型信息接口的数量(0 或 1)。Retrieves the number of type information interfaces that an object provides (either 0 or 1).

(Inherited from Attribute)
_Attribute.Invoke(UInt32, Guid, UInt32, Int16, IntPtr, IntPtr, IntPtr, IntPtr) _Attribute.Invoke(UInt32, Guid, UInt32, Int16, IntPtr, IntPtr, IntPtr, IntPtr) _Attribute.Invoke(UInt32, Guid, UInt32, Int16, IntPtr, IntPtr, IntPtr, IntPtr) _Attribute.Invoke(UInt32, Guid, UInt32, Int16, IntPtr, IntPtr, IntPtr, IntPtr)

提供对某一对象公开的属性和方法的访问。Provides access to properties and methods exposed by an object.

(Inherited from Attribute)

适用于