¿Cómo decide un analizador WSDL generar un método vacío para una operación de solicitud/respuesta?

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

Pregunta

He pasado 5 horas en esto, y ya he pasado 30 horas escribiendo esta especie de contrato (fecha límite "agresiva", Ergo Stupid) y no puedo ver lo que me estoy perdiendo.

No quiero una operación unidireccional como espero fallas. Ya he creado un servicio WCF simple y examiné el WSDL que genera y lo hace Viaje de ida y vuelta a un método de vacío, pero lo he estado mirando tanto tiempo (y WSDL 1.1 es tan molesto en el mejor de los casos: rode en 2.0 por favor) que ya no puedo ver cuál es el truco de magia.

¿Alguien puede proporcionar un WSDL muy simple que explique la magia? Estoy aturdiendo tanto a Jax-WS 2.2 como WCF 3.5/4.0 con este WSDL. Estoy escribiendo a mano el WSDL y cada vez que intento construir proxies (en Java o .NET) siempre construye un método con el mensaje de retorno. Lo estoy perdiendo.

¿Fue útil?

Solución

Un método "nulo" no significa necesariamente que sea una operación unidireccional. Las dos operaciones a continuación son diferentes:

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

La primera es realmente una operación unidireccional: cualquier excepción / fallas lanzadas por el servidor no se propagará al cliente, mientras que en el segundo, aunque no "devuelve" nada, si el servidor lanza una excepción ( por ejemplo, un FaultException), la excepción se devolverá a la persona que llama.

Actualizar: Para responder la pregunta planteada en el título, el analizador WSDL decide generar una operación nula (al menos la utilizada por WCF) si el esquema para el mensaje de salida de la operación está vacío.

Por ejemplo, en el siguiente código:

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();
    }
}

Si lo ejecutas y navegas a http: // localhost: 8000/servicio? wsdl Verás eso:

  1. La operacion Process1 (En WSDL: Porttype/WSDL: Operation) Solo tiene un mensaje de entrada
  2. ambas cosas Add y Process2 (operaciones R/R) tienen tanto mensajes de entrada como de salida

Ahora, la parte del mensaje para el mensaje de salida para esas 2 operaciones hace referencia a su esquema en el esquema importado (en http: // localhost: 8000/servicio? xsd = xsd0). Puedes ver eso:

  1. El esquema para la respuesta para el Process2 Operación (tipo complejo Process2Response) es un elemento vacío (es decir, una secuencia vacía)
  2. El esquema para la respuesta para el Add operación (AddResponse) es una secuencia que contiene un elemento (un xs:int valor).

Entonces el procesador generará un void método para Process2 (ya que no devuelve nada) y un método no void para Add.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top