2011-06-24 25 views
6
[ServiceContract(Namespace = "http://schemas.mycompany.com/", Name = "MyService")] 
public interface IMyService 
{ 
    [OperationContract(Name = "MyOperation") 
    OperationResponse MyOperation(OperationRequest request); 
} 

En este escenario, ¿cuál es el objetivo de Action y ReplyAction?WCF OperationContract: ¿Cuál es el punto de acción y ReplyAction?


Edit: Debo aclarar mi pregunta ...

¿Cómo mi WSDL diferentes si no especifico estas partes? ¿No usará simplemente alguna combinación del espacio de nombres, el nombre del servicio y el nombre de la operadora de todos modos?

Respuesta

7

Solo necesita las propiedades de Acción/Respuesta si desea personalizar esos valores en los mensajes (y están reflejados en el WSDL). Si no los tiene, el valor predeterminado es <serviceContractNamespace> + <serviceContractName> + <operationName> para la Acción y <serviceContractNamespace> + <serviceContractName> + <operationName> + "Response" para ReplyAction.

El siguiente código imprime las propiedades Acción/Acción de respuesta de todas las operaciones en el servicio.

public class StackOverflow_6470463 
{ 
    [ServiceContract(Namespace = "http://schemas.mycompany.com/", Name = "MyService")] 
    public interface IMyService 
    { 
     [OperationContract(Name = "MyOperation")] 
     string MyOperation(string request); 
    } 
    public class Service : IMyService 
    { 
     public string MyOperation(string request) { return request; } 
    } 
    public static void Test() 
    { 
     string baseAddress = "http://" + Environment.MachineName + ":8000/Service"; 
     ServiceHost host = new ServiceHost(typeof(Service), new Uri(baseAddress)); 
     host.AddServiceEndpoint(typeof(IMyService), new BasicHttpBinding(), ""); 
     host.Open(); 
     Console.WriteLine("Host opened"); 

     foreach (ServiceEndpoint endpoint in host.Description.Endpoints) 
     { 
      Console.WriteLine("Endpoint: {0}", endpoint.Name); 
      foreach (var operation in endpoint.Contract.Operations) 
      { 
       Console.WriteLine(" Operation: {0}", operation.Name); 
       Console.WriteLine(" Action: {0}", operation.Messages[0].Action); 
       if (operation.Messages.Count > 1) 
       { 
        Console.WriteLine(" ReplyAction: {0}", operation.Messages[1].Action); 
       } 
      } 
     } 

     Console.Write("Press ENTER to close the host"); 
     Console.ReadLine(); 
     host.Close(); 
    } 
} 
+0

Así que más o menos si lo hiciera 'ReplyAction = "http://schemas.mycompany.com/MyService/MyOperation"' que sería idéntica para construirlo por sí mismo? – michael

+1

No, la acción de respuesta sería '" http://schemas.mycompany.com/MyService/MyOperationResponse "'. Actualizaré la respuesta con cómo imprimir las acciones de acción/respuesta de la operación. – carlosfigueira

+0

Lo siento, quise decir 'Action' y' ReplyAction' sería lo mismo pero con "Response" anexado. – michael

1

A veces, el WSDL generado simplemente no es adecuado para usted. Una cosa interesante que también puede hacer es establecer Acción = "*" para crear un manejador de mensajes no reconocido.

http://msdn.microsoft.com/en-us/library/system.servicemodel.operationcontractattribute.action.aspx

+1

¿Por qué alguien querría crear un "controlador de mensajes no reconocido"? – michael

+3

¡Seguro que lo dejó perplejo, Michael! ¡Casi 2 años y todavía está pensando en eso! : P – seekerOfKnowledge

+6

@michael Creo que no es un "manejador de mensaje_ no reconocido", sino un "manejador de mensaje no reconocido". –

0

Acción define su URI de entrada para la operación de jabón para su método de servicio.

ReplyAction define la salida uri para su método de servicio.

Básicamente se utilizan para personalizar el uri para ambos.

[ServiceContract] 
public partial interface IServiceContract 
{ 
    [OperationContract(
      Action = "http://mynamspace/v1/IServiceContract/Input/ServiceMethod", 
      ReplyAction = "http://mynamspace/v1/IServiceContract/Output/ServiceMethod")] 
    SomeResponseType ServiceMethod(SomeRequestType x); 

En su WSDL que se vería

<wsdl:portType name="IServiceContract"> 
    <wsdl:operation name="ServiceMethod"> 
    <wsdl:input wsaw:Action="http://mynamspace/v1/IServiceContract/Input/ServiceMethod" name="SomeRequestType" message="tns:SomeRequestType " /> 
    <wsdl:output wsaw:Action="http://mynamspace/v1/IServiceContract/Output/ServiceMethod" name="SomeResponseType" message="tns:SomeResponseType " /> 
Cuestiones relacionadas