在使用await的WCF方法中返回一个项

本文关键字:一个 返回 await 方法 WCF | 更新日期: 2023-09-27 18:08:18

我正在使用WCF创建一个RESTful web服务。考虑下面的Service契约和实现:

[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方法必须标记为async,因此不能返回salesitem。它必须返回void或一个不会为我工作的任务,因为该方法必须返回SaleItem,以便序列化器将其转换为JSON并将其返回给客户端。

如何解决这个问题?

另一个相关问题:

方法A调用方法B调用方法C—方法C使用await。这是否自动要求所有其他方法都是异步的,因此总是返回Task<>或void?

在使用await的WCF方法中返回一个项

假设FindItem是一个第三方API方法。由于我使用的是await, GetItemDetails方法必须标记为async,因此不能返回salesitem。它必须返回void或一个不会为我工作的任务,因为该方法必须返回SaleItem,以便序列化器将其转换为JSON并将其返回给客户端。

It WILL work。From MSDN:

客户端可以向开发人员提供他们选择的任何编程模型,只要观察到底层的消息交换模式。因此,只要遵守指定的消息模式,服务也可以以任何方式实现操作。

这意味着WCF可以在单个消息的同步和异步模式之间切换。Noseratios link提供了一个广泛的答案:不同形式的WCF服务契约接口

方法A调用方法B调用方法C—方法C使用await。这是否自动要求所有其他方法都是异步的,因此总是返回Task<>还是无效?

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

在某些情况下,让你的方法async是不必要的,简单地返回内部调用的Task就足够了,你可以在这里阅读更多关于它的信息:返回;"and "返回Task.Run()"?