Как синтаксический анализатор WSDL решает генерировать метод void для операции запроса/ответа?

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

Вопрос

Я потратил 5 часов на это, и я уже встал 30 часов, написав эту спецификацию по контракту («агрессивный» крайний срок, глупый), и я не вижу, что мне не хватает.

Я не хочу операции в одну сторону, так как ожидаю недостатков. Я уже создал простую службу WCF и изучил WSDL, который он генерирует, и он делает Поездка туда и обратно в void метод, но я так долго смотрел на него (и WSDL 1.1 настолько раздражает в лучшие времена - на 2,0, пожалуйста), что я больше не могу видеть, что такое волшебный трюк.

Может ли кто -нибудь предоставить очень простой WSDL, объясняющий магию? Я нацелен на JAX-WS 2.2 и WCF 3.5/4.0 с этим WSDL. Я пишу вручную WSDL, и каждый раз, когда я пытаюсь создавать прокси (в Java или .net), он всегда строит метод с возвращающимся сообщением. Я теряю это.

Это было полезно?

Решение

Метод «void» не обязательно означает, что это односторонняя операция. Две операции ниже разные:

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

Первый - это действительно односторонняя операция - любые исключения / недостатки, брошенные сервером, не будут распространяться на клиент, хотя во втором, хотя он ничего не «возвращает», если сервер бросает исключение (исключение ( Например, а FaultException), исключение будет возвращено обратно в абонента.

Обновлять: Чтобы ответить на вопрос, поставленного в заголовке, анализатор WSDL решает генерировать операцию void (по крайней мере, ту, которая используется WCF), если схема для выходного сообщения операции пуста.

Например, в коде ниже:

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

Если вы запустите его и просматриваете http: // localhost: 8000/service? wsdl Вы увидите это:

  1. Операция Process1 (В соответствии с WSDL: Porttype/WSDL: операция) имеет только входное сообщение
  2. оба Add а также Process2 (операции R/R) имеют как вход, так и выходные сообщения

Теперь часть сообщения для выходного сообщения для этих 2 операций ссылается на их схему в импортированной схеме (в http: // localhost: 8000/service? xsd = xsd0) Ты это видишь:

  1. Схема для ответа для Process2 Работа (комплексный тип Process2Response) - пустой элемент (то есть пустая последовательность)
  2. Схема для ответа для Add операция (AddResponse) - это последовательность, содержащая один элемент ( xs:int ценность).

Таким образом, процессор генерирует void Метод для Process2 (так как это ничего не возвращает) и не вециктивный метод для Add.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top