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

W tym scenariuszu, jaki jest sens Action i ReplyAction?WCF OperationContract - Jaki jest sens działania i ReplyAction?


Edit: muszę wyjaśnić moje pytanie ...

Jak mój WSDL różnią się, jeśli nie określić te elementy? Czy to nie będzie po prostu używać jakiejś kombinacji przestrzeni nazw, nazwy usługi i nazwy operacji?

Odpowiedz

7

Potrzebne są tylko właściwości Action/ReplyAction, jeśli chcesz dostosować te wartości w komunikatach (i znajdują odzwierciedlenie w pliku WSDL). Jeśli ich nie masz, domyślną wartością jest <serviceContractNamespace> + <serviceContractName> + <operationName> dla Akcji i <serviceContractNamespace> + <serviceContractName> + <operationName> + "Response" dla ReplyAction.

Poniższy kod wyświetla właściwości Action/ReplyAction wszystkich operacji w usłudze.

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

Więc dość dużo, jeśli zrobiłem 'ReplyAction = "http://schemas.mycompany.com/MyService/MyOperation"' które byłyby identyczne do budowania go na własną rękę? – michael

+1

Nie, odpowiedzią będzie "http://schemas.mycompany.com/MyService/MyOperationResponse" ". Zaktualizuję odpowiedź, aby wydrukować właściwości akcji/odpowiedzi akcji. – carlosfigueira

+0

Przepraszam, miałem na myśli "Akcja" i "ReplyAction" byłyby takie same, ale z dołączonym "Response". – michael

1

Czasami wygenerowany WSDL nie jest odpowiedni dla Ciebie. Jedną z interesujących rzeczy, które możesz zrobić, to ustawić Action = "*", aby utworzyć nierozpoznaną procedurę obsługi komunikatów.

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

+1

Dlaczego ktoś chciałby utworzyć "nierozpoznaną procedurę obsługi wiadomości"? – michael

+3

Pewnie go zaskoczyłeś, michael! Prawie 2 lata i wciąż o tym myśli! : P – seekerOfKnowledge

+6

@michael Uważam, że nie jest to "nierozpoznany program obsługi wiadomości", ale "nierozpoznany moduł obsługi wiadomości". –

0

Action definiuje swoją wejściowego URI dla funkcjonowania mydło dla metody usługi.

Funkcja ReplyAction definiuje wyjście uri dla wybranej metody serwisowej.

Są one w zasadzie używane do dostosowania URI dla obu.

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

W swojej WSDL można zobaczyć

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