[英]WCF async implementation with 'normal' interface
我读过的每篇关于为WCF服务执行异步实现的文章都需要修改WCF服务的接口(例如,操作的返回类型从T转到Task)。 但是,我不想修改操作签名,因为我的客户端代码对Task <>类型一无所知。 我只是希望实现是同步的。
我可以通过一个'wrapper'方法来实现现有的同步入口点,该方法调用内部异步实现方法,然后进行等待,但这会阻塞调用包装器的线程,这就破坏了异步实现(释放这些线程以便它们可以为其他请求提供服务)。
所以,我需要WCF知道实现是异步的,但也知道接口不是。
服务器的“异步”不会影响客户端的“异步”。 例如,在我正在处理的项目上,我在服务器上有以下内容
[ServiceContract(Namespace = "http://example.com/Example/v1", ProtectionLevel = ProtectionLevel.EncryptAndSign)]
public interface IClientsUploader
{
[OperationContract()]
Task<Results> UploadClientsAsync(Database database, Client[] clients);
}
但在客户端我有合同
[System.ServiceModel.ServiceContractAttribute(Namespace="http://example.com/Example/v1", ConfigurationName="Example.IClientsUploader")]
public interface IClientsUploader
{
[System.ServiceModel.OperationContractAttribute(Action="http://example.com/Example/v1/IClientsUploader/UploadClients", ReplyAction="http://example.com/Example/v1/IClientUploader/UploadClientsResponse")]
Example.DataStructures.Results UploadClients(Example.DataStructures.Database database, System.Collections.Generic.IEnumerable<Example.DataStructures.Client> clients);
}
它完美无缺。 WCF注意到Task
XxxxAsync
模式并将其转换为端点,而没有Task<T>
返回类型和Async
后缀。 然而,当一个操作进入时,可以使用await
内部的操作来处理操作。
如果您的客户端可以是回调引用,那么您可以使用回调实现来表现为异步调用。 您只需要在服务合同中添加回调合同并在客户端上实现它。
然后你可以调用你的服务,在服务器端的操作中你可以启动一个异步任务(并立即从被调用的操作返回),当任务完成后,你可以通过回调契约接口回调你的原始客户端。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.