看看this tutorial 用于 WCF,这个MSDN Article 用于双工服务。
你的定义差不多了,我自己将上面的定义为:
Service Contract - 定义 Web 服务向客户端公开的操作的接口。
回调合同 - 类似于服务合同,但正如您所注意到的,用于客户端。这定义了 Web 服务如何作为单独的调用与客户端通信。 (与简单地从服务合同中的调用返回数据相反)。这些通常用于从长时间运行的 Web 服务调用或事件信号中返回值。
IsOneWay = true 在服务合同上 - 这指定服务操作不返回任何值,因此客户端将简单地“触发并忘记”。对 web 服务的调用在完成之前不会阻塞客户端,而是立即返回。因此,IsOneWay = true 的操作只能返回 void。
IsOneWay = true 在回调合约上 - 这与在服务合约上的大致相同。当服务端调用回调合约上的操作时,会立即返回,不会阻塞,直到操作完成。
Void 返回 - 如果 IsOneWay 未设置为 true,则调用仍将阻塞,直到操作完成,仍将返回 SOAP 消息,但没有数据(除非您传递回错误)。如果您希望实际返回值,您可以像使用普通方法一样执行此操作,设置操作的返回类型,即
[ServiceContract]
public interface IService
{
[OperationContract]
DateTime GetDateTime();
}
public class Service : IService
{
public DateTime GetDateTime()
{
return DateTime.Now;
}
}
或者,您可以创建一个双工服务,带有回调合同,以及IsOneWay = true
[ServiceContract(CallbackContract = typeof(ICallbackService))]
public interface IService
{
[OperationContract(IsOneWay = true)]
void GetDateTime();
}
public interface ICallbackService
{
[OperationContract(IsOneWay = true)]
void GetDateTimeCompleted(DateTime dateTime);
}
public class Service : IService
{
public void GetDateTime()
{
// Do long action here.
...
Callback.GetDateTimeCompleted(DateTime.Now);
}
ICallbackService Callback
{
return OperationContext.Current.GetCallbackChannel<ICallbackService>();
}
}
使用这种方法:
- 对网络服务
GetDateTime() 操作的调用将立即返回
- “非常长的操作”将在服务器上执行
- 客户端上的
GetDateTimeCompleted(DateTime dateTime) 将在服务器完成时触发。
请注意,上述双工示例并不完整,您需要确保正确处理会话等内容。
您绝对是在正确的轨道上。我建议遵循上面链接的教程(以及您找到的任何其他教程)并进行试验。您很快就会对可能发生的事情有一个很好的感觉。