【问题标题】:How to add async support to a .NET 4.5 WCF service so it doesn't disrupt existing clients?如何向 .NET 4.5 WCF 服务添加异步支持,以免中断现有客户端?
【发布时间】:2015-03-09 01:39:23
【问题描述】:

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

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

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

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

【问题讨论】:

  • 您使用的是共享模型对吗?您还没有添加服务参考?
  • ^对于解决方案中的项目,是的。还有外部的非 .NET 客户端。

标签: .net wcf asynchronous async-await channelfactory


【解决方案1】:

只要您重命名服务器端方法以包含单词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(而且您真的不应该,客户端接口应该包含两个版本。这样客户端可以决定是否使用是否要进行阻塞呼叫)。但是,您仍然可以在它们之间使用共享模型。

【讨论】:

  • 谢谢。这与我所追求的非常接近,尽管不幸的是不再能够为客户端和服务器使用相同的接口,这意味着必须更改一些客户端代码。我不明白的一件事是为什么客户端需要知道或关心服务器端调用是否是异步的。同样,异步客户端调用应该对服务器没有影响或可见性。
  • @RickNZ 你是对的,客户端不应该知道也不关心服务器端发生了什么,这就是为什么你通常不会在服务器上使用相同的接口来托管 WCF 服务。在客户端上使用 WCF 服务。强迫他们使用相同的界面会造成人为的限制。并且不需要更改客户端代码,您可以使用相同的接口离开客户端,您只需要编写一个服务器将使用的具有相同方法签名的新内部接口,除了添加单词Async 并让它返回一个任务在适当的情况下。
  • 是的,它奏效了。我遇到的唯一问题是服务器的接口名称必须与客户端使用的相同。不过,它可以位于不同的命名空间中。
  • @RickNZ 如果您设置 ServiceContract 的 Name 属性,您可以让它公开的名称与接口名称不同,这将让您使用不同的实际接口名称但仍使用旧的“遗留”名称(我认为,只有大约 80% 的人对此有把握,目前还没有任何东西可以测试)。
猜你喜欢
  • 2012-11-21
  • 1970-01-01
  • 1970-01-01
  • 2012-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多