.NET 4.0生成基于任务的客户端WCF服务调用

6
在Visual Studio 2012中,有一个方便的“生成基于任务的操作”选项,您可以使用它来生成WCF服务调用的TaskTask<T>版本。
我正在使用Microsoft.Bcl.Async NuGet包,在我的.NET 4.0项目中利用async/await。但是,我似乎无法在VS 2012中使用Configuration Service Reference向导来生成基于任务的操作(该选项被禁用)。
据我所知,这仅在项目针对.NET 4.5时才起作用。是否有人知道如何在.NET 4.0客户端上生成基于任务的操作?

你尝试过暂时切换到 .Net 4.5,生成 WCF 代码,然后再切换回来吗? - svick
@svick 好主意,但是不幸的是,在切换回4.0之后它不起作用。"[ServiceReference] 不适用于当前的 .NET Framework 版本或项目类型" - Jeremy
1个回答

2
您可以使用以下方法在.Net 4.0中创建基于异步任务的WCF客户端:
  • 打开NuGet并将“Microsoft.Bcl.Async”软件包添加到您的.Net 4.0项目中
  • 使用与您的.Net 4.0项目相同的名称创建一个新的.Net 4.5项目的新解决方案
  • 添加服务引用(到所需的Web服务),其名称与在.Net 4.0项目中创建的服务引用相同
  • 确保在高级选项对话框中勾选“允许生成异步操作”下的“生成基于任务的操作”选项
  • 打开您的.Net 4.5项目的服务引用文件夹(“NET_4.5_PROJECT_FOLDER\Service References\YOUR__SERVICE_REFERENCE_FOLDER\”)
  • 复制该文件夹中的所有文件
  • 打开您的.Net 4.0项目的服务引用文件夹(“NET_4.0_PROJECT_FOLDER\Service References\YOUR__SERVICE_REFERENCE_FOLDER\”)
  • 将从.Net 4.5服务引用文件夹中复制的文件粘贴到.Net 4.0服务引用文件夹中
总之,您需要在.Net 4.5中生成服务引用,并将其复制到您的.Net 4.0项目中。强烈建议将“Microsoft.Bcl.Async”软件包添加到您的.Net 4.0项目中。
编辑:我发现此解决方法仅在计算机上安装了.Net Framework 4.5时才有效。如果您在安装了.Net Framework 4.0的计算机上运行程序,则无法正常工作(Windows XP不支持.Net Framework 4.5,因此它是测试程序的良好环境)。当未安装.Net Framework 4.0时会引发以下异常:“类型'System.Threading.Tasks.Task`1[System.Boolean]'无法序列化。请考虑使用DataContractAttribute属性标记它,并使用DataMemberAttribute属性标记要序列化的所有成员。如果该类型是集合,请考虑使用CollectionDataContractAttribute。有关其他受支持的类型,请参阅Microsoft .NET Framework文档。”总之,这不是一个好的解决方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接