wcf测试客户端不支持此操作,因为它使用system.threading.tasks.task

sag*_*y36 5 .net c# wcf multithreading entity-framework

我正在尝试在我的WCF服务中创建一个异步方法,但我收到上述主题错误消息.我只想返回一个类别列表.

为了清楚起见,最后在上面的错误消息中添加以下内容:YeagerTechModel.Category []

除了此方法(旁边有一个红色的"X")之外,成功添加了wcfclient服务.实际上,所有方法(在wcf服务客户端中)都期望一个关联的异步方法(红色"X")与其他常规同步方法一起使用.

我知道如何使用WCF,但我不是它的专家.为了使这个功能正常,我需要做什么?

我正在使用VisualStudio 2013的完整版本,并使用4.5.1框架进行项目.我也在使用EntityFramework 6.

我的服务合同包含以下命名空间.

using System.Threading.Tasks;
Run Code Online (Sandbox Code Playgroud)

我的经营合同如下.

[OperationContract(Name="GetCategoriesAsync")]
Task<List<Category>> GetCategoriesAsync();
Run Code Online (Sandbox Code Playgroud)

我的DataContract如下:

namespace YeagerTechModel
{
    using System;
    using System.Runtime.Serialization;
    using System.ServiceModel;
    using System.Collections.Generic;

    [Serializable, DataContract(IsReference = true)] 
    public partial class Category
    {
        public Category()
        {
            this.Projects = new HashSet<Project>();
        }

        [DataMember]
        public short CategoryID { get; set; }
        [DataMember]
        public string Description { get; set; }

        [DataMember]
        public virtual ICollection<Project> Projects { get; set; }
    }
}
Run Code Online (Sandbox Code Playgroud)

我的Web服务中的方法如下.请注意,我没有任何设计时编译错误,并且可以成功构建解决方案:

public async Task<List<Category>> GetCategoriesAsync()
        {
            try
            {
                using (YeagerTechEntities DbContext = new YeagerTechEntities())
                {
                    DbContext.Configuration.ProxyCreationEnabled = false;
                    DbContext.Database.Connection.Open();

                    var category = await DbContext.Categories.ToListAsync();

                    return category;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
Run Code Online (Sandbox Code Playgroud)

小智 3

为什么你的服务要异步?异步方法是在客户端使用服务引用创建的。当您向服务添加服务引用时,将该服务引用标记为允许生成异步操作。使用 VS 2013 和 .NET 4.5,您可以进行基于任务的操作或异步操作。

然后您的客户端可以调用异步方法返回任务,然后 future 等待任务以获取返回对象。或者调用 begin 方法并在完成 begin 方法调用时进行回调。假设您需要客户端异步调用。这些是在服务代码中的客户端而不是服务器端。

示例显示在这篇文章中:http://www.codeguru.com/columns/experts/building-and-consuming-async-wcf-services-in-.net-framework-4.5.htm