Как синтаксический анализатор WSDL решает генерировать метод void для операции запроса/ответа?
-
25-10-2019 - |
Вопрос
Я потратил 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 Вы увидите это:
- Операция
Process1
(В соответствии с WSDL: Porttype/WSDL: операция) имеет только входное сообщение - оба
Add
а такжеProcess2
(операции R/R) имеют как вход, так и выходные сообщения
Теперь часть сообщения для выходного сообщения для этих 2 операций ссылается на их схему в импортированной схеме (в http: // localhost: 8000/service? xsd = xsd0) Ты это видишь:
- Схема для ответа для
Process2
Работа (комплексный типProcess2Response
) - пустой элемент (то есть пустая последовательность) - Схема для ответа для
Add
операция (AddResponse
) - это последовательность, содержащая один элемент (xs:int
ценность).
Таким образом, процессор генерирует void
Метод для Process2
(так как это ничего не возвращает) и не вециктивный метод для Add
.