我会发布这个问题,即使我发现很少有其他类似的问题。但是,我无法找到令人满意的解决方案,无论是为什么我得到这个错误,也不知道如何解决它。
所以,今天我必须在我的本地计算机上托管服务以进行测试。该服务是一个单一的WCF服务解决方案,据我所知,它已经工作了很长时间。但是,当我下载项目并尝试在本地计算机上托管服务时,我从标题中得到了错误:
WCF测试客户端不支持此操作,因为它使用类型System.Threading
所以当我回到家时,我决定使用一些异步方法提供服务,并深入了解这一点。然而,当我在几乎没有使用(或至少看起来如此)System.Threading.Tasks
任何地方的空项目中得到这个完全相同的错误时,我真的很惊讶。
所以我做了什么:
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>
我甚至没有尝试使用Task
,Threading
或类似的东西,只是想看到我的服务正常运行所以我可以开始添加内容,看看我到底是什么时候我会得到错误,但是在设置Service1.svc
作为我的启动类并尝试运行项目后,我得到了同样的错误:
WCF测试客户端不支持此操作,因为它使用类型System.Threading
好的,现在我完全迷失了。几次尝试运行我的项目后,我收到此错误。在发布此问题之前,我再次尝试,这次我没有收到错误。事实上,我刚刚完成了我的客户端,我可以使用GetEmpId()
方法。
那么这里发生了什么。这是我构建项目时的屏幕截图:
我没有方法GetEmpIdAsync()
。我没有尝试添加它。它是怎么来的它不会多次构建,现在突然间我能够使用我从一开始实际实现的方法?
答案 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添加支持。没有实际错误。如果您真的想测试异步版本,则需要编写自己的调用该函数的测试客户端。