5

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

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

wcfclient 服务已成功添加,但此方法除外(旁边有一个红色的“X”)。实际上,所有方法(在 wcf 服务客户端中)都需要一个关联的异步方法(带有红色“X”)以及其他常规同步方法。

我知道如何使用 WCF,但不是这方面的专家。我需要做什么才能使其正常运行?

我正在使用 VisualStudio 2013 的完整发布版本,并且该项目使用 4.5.1 框架。我也在使用 EntityFramework 6

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

using System.Threading.Tasks;

我的经营合同如下。

[OperationContract(Name="GetCategoriesAsync")]
Task<List<Category>> GetCategoriesAsync();

我的数据合同如下:

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; }
    }
}

我的网络服务中的方法如下。请注意,我没有任何设计时编译错误,并且能够成功构建解决方案:

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;
            }
        }
4

2 回答 2

3

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

然后您的客户端可以调用 async 方法来返回一个任务,然后将来等待该任务来获取返回对象。或者在 begin 方法调用完成时使用回调调用 begin 方法。假设您想要客户端异步调用。这些是服务代码中的客户端而不是服务器端。

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

于 2014-01-08T22:21:14.043 回答
0

尝试从您的操作中删除后缀“异步”。我相信它是保留的。

我无法证明这一点,但我认为 VS 2013 Update 1 已经悄悄地改变了一些东西,因为我记得我无法调用任务操作,现在我可以了。

[ServiceContract]
public interface IXmlImportService
{
    [OperationContract]
    Task<ImportResult> Import(ImportRequest request);
}

在这里使用它的 WCF 测试客户端。

WCF 测试客户端使用异步操作访问 WCF 服务

于 2014-02-11T08:47:16.473 回答