与异步服务的WCF SharedInterface定义

本文关键字:SharedInterface 定义 WCF 异步 服务 | 更新日期: 2023-09-27 18:19:45

我在定义服务的接口上遇到问题。我在Silverlight、WPF和我的后端中使用相同的接口。

例如:

#if !SILVERLIGHT
    [OperationContract(IsOneWay = false)]
    SecurityOperationInfo LogonUser(string sessionId, string username, string password);
#else
    [OperationContract(IsOneWay = false, AsyncPattern = true)]
    IAsyncResult BeginLogonUser(string sessionId, string username, string password, AsyncCallback callback, object state);        
    SecurityOperationInfo EndLogonUser(IAsyncResult result);
#endif

问题是,我在Silverlight中使用接口(它运行良好)。现在我也想在WPF中使用Async方式,但我不想在服务器端实现Begin和End!但是我的WPF项目链接到了实现这个接口的同一个DLL!

有什么方法可以简单地实现这一点吗?

与异步服务的WCF SharedInterface定义

幸运的是,在WCF中,您可以为客户端和服务器端实现提供单独的接口。服务器端实现可以完全异步,而客户端接口具有同步操作,反之亦然。在您的情况下,我将为客户端异步操作创建一个派生接口。这样,服务器端实现可以保持同步,而客户端可以异步实现操作。

[ServiceContract(Name = "IMyService", ...)]
public interface IMyService {
   [OperationContract(IsOneWay=false)]
   SecurityOperationInfo LogonUser(string sessionId, string username, string password);
   // other methods ...
}
[ServiceContract(Name = "IMyService", ...)]
public interface IMyServiceAsync : IMyService {
    [OperationContract(IsOneWay = false, AsyncPattern = true)]
    IAsyncResult BeginLogonUser(string sessionId, string username, string password, AsyncCallback callback, object state);        
    SecurityOperationInfo EndLogonUser(IAsyncResult result);
}

请注意,两个服务协定的名称必须匹配,否则WCF将无法连接到该服务。