Метод "void" не обязательно означает, что это односторонняя операция.Две операции ниже отличаются:
[ServiceContract]
public interface ITest
{
[OperationContract(IsOneWay = true)]
void Process1();
[OperationContract]
void Process2();
}
Первая действительно односторонняя операция - любые исключения / сбои, выданные сервером, не будут распространяться на клиента, в то время как во второй, хотяон ничего не «возвращает», если сервер выдает исключение (например, FaultException
), исключение будет возвращено вызывающей стороне.
Обновление : ответитьвопрос, поставленный в заголовке, анализатор WSDL решает сгенерировать пустую операцию (по крайней мере ту, которая используется 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: operation) имеет только входное сообщение - и
Add
и Process2
(операции r / r) имеют как входные, так и выходные сообщения
Теперь сообщениечасть для выходного сообщения для этих двух операций ссылаются на их schema в импортированной схеме (на http://localhost:8000/service?xsd=xsd0). Вы можете видеть, что:
- Схема для ответа на операцию
Process2
(сложный тип Process2Response
) является пустым элементом (т.е. пустая последовательность) - Схема ответа для операции
Add
(AddResponse
) представляет собой последовательность, содержащую один элемент (значение xs:int
).
Таким образом, процессор сгенерирует метод void
для Process2
(поскольку он ничего не возвращает) и метод без пустот для Add
.