与异步服务的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中,您可以为客户端和服务器端实现提供单独的接口。服务器端实现可以完全异步,而客户端接口具有同步操作,反之亦然。在您的情况下,我将为客户端异步操作创建一个派生接口。这样,服务器端实现可以保持同步,而客户端可以异步实现操作。
[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将无法连接到该服务。