Wie beschließt ein WSDL -Parser, eine Void -Methode für einen Anforderungs-/Antwortvorgang zu generieren?

StackOverflow https://stackoverflow.com/questions/8316567

Frage

Ich habe 5 Stunden damit verbracht, und ich habe bereits 30 Stunden in der Vertragszeit geschrieben ("aggressive" Frist, Ergo dumm) und ich kann nicht sehen, was mir fehlt.

Ich möchte keinen Einweg-Betrieb, wie ich Fehler erwarte. Ich habe bereits einen einfachen WCF tut Hin- und Rückfahrt zu einer Void -Methode, aber ich habe es so lange anstarrt (und WSDL 1.1 ist in den besten Zeiten so ärgerlich - bitte auf 2.0), dass ich nicht mehr sehen kann, was der Zaubertrick ist.

Kann jemand ein sehr einfaches WSDL liefern, das die Magie erklärt? Ich ziele sowohl mit JAX-WS 2.2 als auch mit WCF 3.5/4.0 mit diesem WSDL ab. Ich schreibe das WSDL von Hand und jedes Mal, wenn ich versuche, Proxys (in Java oder .NET) zu erstellen, erstellt es immer eine Methode mit der Rückgabenachricht. Ich verliere es.

War es hilfreich?

Lösung

Eine "void" -Methode bedeutet nicht unbedingt, dass es sich um eine Einwegoperation handelt. Die beiden folgenden Operationen sind unterschiedlich:

[ServiceContract]
public interface ITest
{
    [OperationContract(IsOneWay = true)]
    void Process1();
    [OperationContract]
    void Process2();
}

Der erste ist wirklich eine Einwegoperation - alle vom Server geworfenen Ausnahmen / Fehler werden nicht an den Client ausgegeben, während er im zweiten, obwohl er nichts "zurückgibt", wenn der Server eine Ausnahme ausgelöst hat (Ausnahme ( zB a FaultException) Die Ausnahme wird an den Anrufer zurückgegeben.

Aktualisieren: Um die im Titel gestellte Frage zu beantworten, beschließt der WSDL -Parser, eine Hohlraumoperation (zumindest die von WCF verwendete) zu erstellen, wenn das Schema für die Ausgabenachricht des Vorgangs leer ist.

Zum Beispiel im folgenden Code:

public class StackOverflow_8316567
{
    [ServiceContract]
    public interface ITest
    {
        [OperationContract(IsOneWay = true)]
        void Process1();
        [OperationContract]
        void Process2();
        [OperationContract]
        int Add(int x, int y);
    }
    public class Service : ITest
    {
        public void Process1() { }
        public void Process2() { }
        public int Add(int x, int y) { return x + y; }
    }
    static Binding GetBinding()
    {
        var result = new BasicHttpBinding();
        return result;
    }
    public static void Test()
    {
        string baseAddress = "http://" + Environment.MachineName + ":8000/Service";
        ServiceHost host = new ServiceHost(typeof(Service), new Uri(baseAddress));
        host.AddServiceEndpoint(typeof(ITest), GetBinding(), "");
        host.Description.Behaviors.Add(new ServiceMetadataBehavior { HttpGetEnabled = true });
        host.Open();
        Console.WriteLine("Host opened");

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

Wenn Sie es laufen und stöbern http: // localhost: 8000/service? WSDL Sie werden das sehen:

  1. Die Operation Process1 (Unter WSDL: PortType/WSDL: Operation) verfügt nur über eine Eingabenachricht
  2. beide Add und Process2 (R/R -Operationen) haben sowohl eine Eingabe- als auch die Ausgabenachrichten

Der Nachrichtenteil für die Ausgabenachricht für diese beiden Operationen verweisen nun auf ihr Schema im importierten Schema (AN http: // localhost: 8000/service? xsd = xsd0). Sie können sehen, dass:

  1. Das Schema für die Antwort auf die Process2 Betrieb (komplexer Typ Process2Response) ist ein leeres Element (dh eine leere Sequenz)
  2. Das Schema für die Antwort auf die Add Betrieb (AddResponse) ist eine Sequenz, die ein Element enthält (a xs:int Wert).

Der Prozessor erzeugt also a void Methode für Process2 (Da es nichts zurückgibt) und eine nicht-void-Methode für Add.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top