“无效”方法并不一定意味着它是一种单向操作。下面的两个操作是不同的:
[ServiceContract]
public interface ITest
{
[OperationContract(IsOneWay = true)]
void Process1();
[OperationContract]
void Process2();
}
第一个实际上是单向操作 - 服务器抛出的任何异常/错误都不会传播到客户端,而在第二个中,虽然它不会“返回”任何东西,但如果服务器抛出异常(例如,a 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:operation 下)只有一个输入消息
- 和(r/r 操作) 都有输入和输出
Add
消息Process2
现在,这两个操作的输出消息的消息部分在导入的模式中引用了它们的模式(在http://localhost:8000/service?xsd=xsd0)。你可以看到:
- 操作响应的
Process2
模式(复杂类型Process2Response
)是一个空元素(即空序列)
Add
操作 ( )的响应模式AddResponse
是包含一个元素(一个xs:int
值)的序列。
所以处理器会生成一个for 的void
方法Process2
(因为它不返回任何东西)和一个非 void 的Add
.