如何向 .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(您真的不应该,客户端接口应该包含两个版本。这样客户端可以决定是否要进行阻塞调用)。但是,您仍然可以在它们之间使用共享模型。
我有一个带有 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(您真的不应该,客户端接口应该包含两个版本。这样客户端可以决定是否要进行阻塞调用)。但是,您仍然可以在它们之间使用共享模型。