次の方法で共有


OperationContractAttribute.Action プロパティ

定義

要求メッセージの WS-Addressing アクションを取得または設定します。

public:
 property System::String ^ Action { System::String ^ get(); void set(System::String ^ value); };
public string Action { get; set; }
member this.Action : string with get, set
Public Property Action As String

プロパティ値

WS-Addressing アクション ヘッダーの生成で使用するアクション。

例外

値が null です。

Action プロパティと ReplyAction プロパティを使用して入力メッセージと出力 (または応答) メッセージの両方の SOAP アクションを明示的に制御し、Name プロパティを使用してメタデータ内の操作の名前を制御するサービスを次の例に示します。 さらに、このアプリケーションでは、Action 値 "*" を使用して、認識されないメッセージを処理するメソッドを示しています。

using System;
using System.Collections.Generic;
using System.ServiceModel;
using System.ServiceModel.Channels;
using System.Text;

namespace Microsoft.WCF.Documentation
{
  [ServiceContract(Namespace="http://Microsoft.WCF.Documentation")]
  public interface ISampleService{

    [OperationContract(
      Action="http://Microsoft.WCF.Documentation/OperationContractMethod",
      Name="OCAMethod",
      ReplyAction="http://Microsoft.WCF.Documentation/ResponseToOCAMethod"
    )]
    string SampleMethod(string msg);

    [OperationContractAttribute(Action = "*")]
    void UnrecognizedMessageHandler(Message msg);
  }

  class SampleService : ISampleService
  {
    public string  SampleMethod(string msg)
    {
      Console.WriteLine("Called with: {0}", msg);
        return "The service greets you: " + msg;
    }

    public void UnrecognizedMessageHandler(Message msg)
    {
      Console.WriteLine("Unrecognized message: " + msg.ToString());
    }
  }
}
Imports System.ServiceModel
Imports System.ServiceModel.Channels
Imports System.Text

Namespace Microsoft.WCF.Documentation
  <ServiceContract(Namespace:="http://Microsoft.WCF.Documentation")> _
  Public Interface ISampleService

        <OperationContract(Action:="http://Microsoft.WCF.Documentation/OperationContractMethod", _
                           Name:="OCAMethod", ReplyAction:="http://Microsoft.WCF.Documentation/ResponseToOCAMethod")> _
        Function SampleMethod(ByVal msg As String) As String

    <OperationContractAttribute(Action := "*")> _
    Sub UnrecognizedMessageHandler(ByVal msg As Message)
  End Interface

  Friend Class SampleService
      Implements ISampleService
    Public Function SampleMethod(ByVal msg As String) As String Implements ISampleService.SampleMethod
      Console.WriteLine("Called with: {0}", msg)
         Return "The service greets you: " & msg
    End Function

    Public Sub UnrecognizedMessageHandler(ByVal msg As Message) Implements ISampleService.UnrecognizedMessageHandler
      Console.WriteLine("Unrecognized message: " & msg.ToString())
    End Sub
  End Class
End Namespace

このコントラクトを実装するサービスは、次の例のようなメッセージを送信します。

<s:Envelope xmlns:a="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:s="http://www.w3.org/2003/05/soap-envelope">
  <s:Header>
    <a:Action s:mustUnderstand="1">http://Microsoft.WCF.Documentation/ResponseToOCAMethod</a:Action>
  </s:Header>
  <s:Body>
    <OCAMethodResponse xmlns="http://Microsoft.WCF.Documentation">
      <OCAMethodResult>The service greets you: Hello!</OCAMethodResult>
    </OCAMethodResponse>
  </s:Body>
</s:Envelope>

注釈

メソッドの Action 入力メッセージのアクションを制御するには、 プロパティを使用します。 WCF はこのアクションを使用して受信メッセージを適切なメソッドにディスパッチするため、コントラクト操作内で使用されるメッセージには一意のアクションが必要です。 既定のアクション値は、コントラクト名前空間 (既定値は "http://tempuri.org/")、コントラクト名 (明示的なサービス インターフェイスが使用されていない場合はインターフェイス名またはクラス名)、操作名、およびメッセージが相関応答である場合は追加の文字列 ("Response") の組み合わせです。 この既定値は、Action プロパティを使用してオーバーライドできます。

サービスが受信したが、サービス操作にダイレクトできないすべてのメッセージを処理するサービス操作であることを示すには、値 "*" (アスタリスク) を指定します。 不一致メッセージ ハンドラーと呼ばれるこの種の操作は、以下のメソッド署名のいずれかを持つ必要があります。これに該当しない場合は、InvalidOperationException がスローされます。

  • サービス操作は Message オブジェクトだけを受け取ることができ、Message オブジェクトを返します。

  • サービス操作は Message オブジェクトだけを受け取ることができ、何も返しません (つまりvoid を返します)。

Note

サービス コントラクトは、Action プロパティが "*" に設定されたサービス操作を 1 つだけ持つことができます。 サービス クラスが実装するのとAction同じ listenUri でホストされているサービス コントラクトのグループは、プロパティが に設定されている場合に、 プロパティが "*" に設定された多くのサービス操作をIsInitiatingfalse持つことができます。 ただし、プロパティを "*" に設定し、プロパティを Action true に設定できるのは、これらのサービス操作の IsInitiating 1 つだけです。 詳細については、「IsInitiating」を参照してください。

適用対象