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

时间:2014-10-28 18:41:40

标签: c# wcf

我会发布这个问题,即使我发现很少有其他类似的问题。但是,我无法找到令人满意的解决方案,无论是为什么我得到这个错误,也不知道如何解决它。

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

  

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

所以当我回到家时,我决定使用一些异步方法提供服务,并深入了解这一点。然而,当我在几乎没有使用(或至少看起来如此)System.Threading.Tasks任何地方的空项目中得到这个完全相同的错误时,我真的很惊讶。

所以我做了什么:

  • 使用Visual Studio 2013默认模板
  • 创建新的WCF Service
  • 保留默认的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; 使用System.Collections.Generic; 使用System.Linq; 使用System.Runtime.Serialization; 使用System.ServiceModel; 使用System.ServiceModel.Web; 使用System.Text;

      命名空间WcfService {    公共类Service1:IService1    {       public 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>

我甚至没有尝试使用TaskThreading或类似的东西,只是想看到我的服务正常运行所以我可以开始添加内容,看看我到底是什么时候我会得到错误,但是在设置Service1.svc作为我的启动类并尝试运行项目后,我得到了同样的错误:

  

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

好的,现在我完全迷失了。几次尝试运行我的项目后,我收到此错误。在发布此问题之前,我再次尝试,这次我没有收到错误。事实上,我刚刚完成了我的客户端,我可以使用GetEmpId()方法。

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

Service

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

1 个答案:

答案 0 :(得分:10)

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

如果你的课程是

public class Service1 : IService1
{
    public Task<int> GetEmpIdAsync(int id)
    {
        return Task.FromResult<int>(id);
    }
}

您仍会在测试工具上看到int GetEmpId(int id)。 WCF足够聪明,可以将两个版本映射到同一个函数。

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