我有一个使用.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)是否阻止通话)。但是,您仍然可以使用它们之间的共享模型。