返回使用await的WCF方法中的项

时间:2014-06-11 08:37:18

标签: c# .net wcf task-parallel-library async-await

我正在使用WCF创建RESTful Web服务。请考虑以下服务合同和实施:

[ServiceContract]
    public interface IItemsSaleService
    {
        [OperationContract]
        [WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped, UriTemplate = "getItemDetails/{itemId}")]
        SaleItem GetItemDetails(string itemId); //GET
}

//IMPLEMENTATION

async public SaleItem GetItemDetails(string itemId) //This wont work. It should be Task<SaleItem>
        {

            SaleItem item = await FindItem(itemId);
            return item;
        }

假设FindItem是第三方API方法。由于我使用await,因此必须将方法GetItemDetails标记为异步,因此无法返回SaleItem。它必须返回void或一个对我不起作用的Task作为方法HAS返回SaleItem,以便序列化程序将其转换为JSON并将其返回给客户端。

我该如何解决这个问题?

另一个相关问题:

方法A调用方法B调用方法C - 方法C使用await。这是否会自动要求所有其他方法都是异步的,因此始终返回Task&lt;&gt;或无效?

1 个答案:

答案 0 :(得分:4)

  

假设FindItem是第三方API方法。由于我使用await,因此必须将方法GetItemDetails标记为异步,因此无法返回SaleItem。它必须返回void或一个对我不起作用的Task作为方法HAS返回SaleItem,以便序列化程序将其转换为JSON并将其返回给客户端。

它会起作用。来自MSDN

  

客户可以为开发人员提供他们选择的任何编程模型,只要遵守基础消息交换模式即可。因此,只要遵守指定的消息模式,服务就可以以任何方式实现操作。

这意味着WCF可以在单个消息的同步模式和异步模式之间切换。 Noseratios链接提供了广泛的答案:Different forms of the WCF service contract interface

  

方法A调用方法B调用方法C - 方法C使用await。这是否会自动要求所有其他方法都是异步的,因此始终返回Task&lt;&gt;或无效?

异步方法本质上一直传播。使用await关键字的方法必须标记其方法async,并且返回类型为TaskTask<T>void。请注意,void返回async方法仅用于异步事件处理程序的兼容性,不应在该范围之外使用。

在某些情况下,让您的方法async不是必然的,只需返回内部调用Task即可,您可以在此处详细了解:Any difference between "await Task.Run(); return;" and "return Task.Run()"?