C# 错误:WCF测试客户端不支持,因为它使用System.Threading.Tasks类型

C# 错误:WCF测试客户端不支持,因为它使用System.Threading.Tasks类型,c#,wcf,C#,Wcf,我将发布这个问题,即使我看到很少有其他类似的问题。然而,我无法找到令人满意的解决方案,无论是我为什么会出现这个错误,还是如何解决它 所以,今天我不得不在我的本地计算机上托管一个服务来进行测试。该服务是一个单一的WCF服务解决方案,据我所知,它已经工作了很长时间。但是,当我下载项目并尝试在本地计算机上托管服务时,我从标题中得到错误: WCF测试客户端不支持此操作,因为它使用System.Threading类型 因此,当我回到家时,我决定使用一些异步方法创建一个服务,并深入了解这个问题。然而,当我在

我将发布这个问题,即使我看到很少有其他类似的问题。然而,我无法找到令人满意的解决方案,无论是我为什么会出现这个错误,还是如何解决它

所以,今天我不得不在我的本地计算机上托管一个服务来进行测试。该服务是一个单一的WCF服务解决方案,据我所知,它已经工作了很长时间。但是,当我下载项目并尝试在本地计算机上托管服务时,我从标题中得到错误:

WCF测试客户端不支持此操作,因为它使用System.Threading类型

因此,当我回到家时,我决定使用一些异步方法创建一个服务,并深入了解这个问题。然而,当我在几乎没有使用(或者至少看起来是这样)System.Threading.Tasks的空项目上遇到同样的错误时,我真的很惊讶

所以我所做的是:

  • 使用Visual Studio 2013默认模板创建新的
    WCF服务
  • 保留默认的
    IService1.cs
    文件和
    Service1.svc
  • IService1.cs
    更改为:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Runtime.Serialization;
    using System.ServiceModel;
    using System.ServiceModel.Web;
    using System.Text;
    
    namespace WcfService
    {
        [ServiceContract]
        public interface IService1
        {
            [OperationContract]
            int GetEmpId(int id);
        }
    }
    
    • Service1.svc
      更改为:

      使用制度; 使用System.Collections.Generic; 使用System.Linq; 使用System.Runtime.Serialization; 使用System.ServiceModel; 使用System.ServiceModel.Web; 使用系统文本

      命名空间WcfService { 公共类服务1:IService1 { 公共int GetEmpId(int id) { 返回id; } } }

保留默认的
web.config
,如下所示:

<system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <!-- To avoid disclosing metadata information, set the values below to false before deployment -->
          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
          <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <protocolMapping>
        <add binding="basicHttpsBinding" scheme="https" />
    </protocolMapping>    
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
  </system.serviceModel>

我甚至没有尝试过使用
任务
线程
之类的东西,我只是想看看我的服务已经启动并运行,这样我就可以开始添加东西,看看什么时候会出现错误,但在将
Service1.svc
设置为我的启动类并尝试运行项目后,我遇到了同样的错误:

WCF测试客户端不支持此操作,因为它使用System.Threading类型

好吧,现在我完全迷路了。在多次尝试运行我的项目后,我遇到了这个错误。在发布这个问题之前,我又试了一次,这次我没有发现错误。事实上,我刚刚完成了我的客户端,我能够使用
GetEmpId()
方法

那么这里发生了什么。这是我构建项目时的屏幕截图:


我没有方法
GetEmpIdAsync()
。我还没有尝试添加它。它是如何实现的?它不会多次构建,现在我突然能够使用我从一开始就实际实现的方法了?

WCF将自动为您的每个方法公开同步和异步接口。这两种方法在服务器端同步调用
GetEmpId
,区别在于等待结果在客户端是同步的还是异步的

如果你让你的班级成为

public class Service1 : IService1
{
    public Task<int> GetEmpIdAsync(int id)
    {
        return Task.FromResult<int>(id);
    }
}
公共类服务1:IService1
{
公共任务GetEmpIdAsync(int-id)
{
返回Task.FromResult(id);
}
}
您仍然可以在测试工具上看到
intgetempid(intid)
。WCF足够聪明,可以将两个版本映射到同一个函数


您看到的“错误”只是VisualStudio附带的测试工具的一个限制,这两个函数调用相同的服务器端函数,因此没有强制力让Microsoft添加支持。没有实际的错误。如果您真的想测试异步版本,您需要编写自己的测试客户端来调用该函数。

谢谢您的解释。这项服务是几年前提供的,而我遇到的错误最让我困惑,因为我知道这项服务已经运行了很长时间。我不打算在异步模式下使用它,相反,我真的很想知道为什么MS会做出这样的约定。至少对我来说,因为我很少使用
WCF
,它看起来真的很奇怪和混乱。我想这是新版本的Visual Studio附带的东西。。。不过,再次感谢。顺便说一句,有没有办法“告诉”工具只查找同步方法,这样我就不会收到这些消息?我不这么认为,那个测试工具。但是,如果您正在使用生成界面,则只需关闭
/async
,或者如果您正在使用“添加服务引用”GUI,只需单击
高级
,然后取消选中“”框