繁体   English   中英

使用“普通”接口的WCF异步实现

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM