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

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

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

在保持服务代码“一直向下”异步的同时,是否有一种直接的方法来保持公开的API不变?

最佳答案

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

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

例如,以下服务契约(Contract)

[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)方法

请注意,您将无法再使用相同的客户端和服务器端接口(interface)来表示API(并且您实际上不应该使用客户端接口(interface)中同时包含这两个版本。这样,客户端可以决定是否要制作该接口(interface)是否阻止通话)。但是,您仍然可以使用它们之间的共享模型。

09-21 00:06