Ter*_*tta 4 c# wcf asynchronous
我读过的每篇关于为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);
}
Run Code Online (Sandbox Code Playgroud)
但在客户端我有合同
[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);
}
Run Code Online (Sandbox Code Playgroud)
它完美无缺.WCF注意到Task XxxxAsync模式并将其转换为端点而没有Task<T>返回类型和Async后缀.然而,当操作进入时,可以使用await内部的操作来处理操作.