如何向 .NET 4.5 WCF 服务添加异步支持以使其不中断现有客户端?

How to add async support to a .NET 4.5 WCF service so it doesn't disrupt existing clients?

我有一个带有 SOAP 端点的现有 WCF 服务,使用 .NET 4.5。大多数现有客户端代码都使用 ChannelFactory<T> 代理方法。

我想更改服务以支持各种服务器端 I/O 和数据库操作的 async / await 模型。

我遇到的问题是,将 async 关键字添加到 WCF 方法调用需要将它们的接口签名更改为 Task<T>。反过来,这似乎需要更改客户端代码。

在保持服务代码异步的同时 "all the way down," 是否有一种直接的方法来保持暴露的 API 不变?

只要您重命名服务器端方法以包含单词 XxxxxAsync,它就不会更改客户端签名。

WCF 自动为每个方法创建两个端点,一个同步版本和一个异步版本。您可以通过 WCF 测试客户端看到这一点。

例如下面的服务合约

[ServiceContract]
public interface IService1
{
    [OperationContract]
    string GetData(int value);
}

public class Service1 : IService1
{
    public string GetData(int value)
    {
        return string.Format("You entered: {0}", value);
    }
}

启动 WCF 测试客户端时,您将看到 2 个可用方法

如果我把代码改成下面这样

[ServiceContract]
public interface IService1
{
    [OperationContract]
    Task<string> GetDataAsync(int value);
}

public class Service1 : IService1
{
    public async Task<string> GetDataAsync(int value)
    {
        await Task.Delay(value);
        return string.Format("You entered and awaited: {0}", value);
    }
}

我仍然可以从我的客户端调用同步 string GetData(int) 方法

请注意,您将无法再使用相同的客户端和服务器端接口来表示 API(您真的不应该,客户端接口应该包含两个版本。这样客户端可以决定是否要进行阻塞调用)。但是,您仍然可以在它们之间使用共享模型。