Compartilhar via


OperationContractAttribute.Action Propriedade

Definição

Obtém ou define a ação WS-Addressing da mensagem de solicitação.

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

Valor da propriedade

String

A ação a ser usada ao gerar o cabeçalho de Action do WS-Addressing.

Exceções

O valor é null.

Exemplos

O exemplo a seguir é um serviço que usa as propriedades e ReplyAction as Action propriedades para controlar explicitamente as ações SOAP das mensagens de entrada e saída (ou resposta) e a Name propriedade para controlar o nome da operação em metadados. Por fim, o aplicativo também usa um Action valor "*" para indicar um método que manipula mensagens não reconhecidas.

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

Um serviço que implementa esse contrato envia mensagens semelhantes ao exemplo a seguir:

<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>

Comentários

Use a Action propriedade para controlar a ação da mensagem de entrada do método. Como o WCF usa essa ação para enviar uma mensagem de entrada para o método apropriado, as mensagens usadas em uma operação de contrato devem ter ações exclusivas. O valor de ação padrão é uma combinação do namespace do contrato (o valor padrão é "http://tempuri.org/"), o nome do contrato (nome da interface ou o nome da classe, se nenhuma interface de serviço explícita for usada), o nome da operação e uma cadeia de caracteres adicional ("Resposta") se a mensagem for uma resposta correlacionada. Você pode substituir esse padrão com a Action propriedade.

Para indicar que uma operação de serviço manipula todas as mensagens recebidas pelo serviço, mas não pode ser direcionada para uma operação de serviço, especifique o valor "*" (um asterisco). Esse tipo de operação, chamado de manipulador de mensagens sem correspondência, deve ter uma das seguintes assinaturas de método ou uma InvalidOperationException é lançada:

  • A operação de serviço pode pegar apenas um Message objeto e retornar um Message objeto.

  • A operação de serviço pode pegar apenas um Message objeto e não retornar nada (ou seja, retornar void).

Observação

Um contrato de serviço pode ter apenas uma operação de serviço com a Action propriedade definida como "*". Qualquer grupo de contratos de serviço hospedados no mesmo listenUri que uma classe de serviço implementa pode ter muitas operações de serviço com a Action propriedade definida como "*" quando a IsInitiating propriedade está definida como false. No entanto, apenas uma dessas operações de serviço pode ter a Action propriedade definida como "*" e a IsInitiating propriedade definida como true. Para obter mais detalhes, confira IsInitiating.

Aplica-se a