【问题标题】:Returning an item in a WCF method that uses await在使用 await 的 WCF 方法中返回项目
【发布时间】:2014-06-11 08:37:17
【问题描述】:

我正在使用 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 方法。由于我使用的是等待,因此必须将方法 GetItemDetails 标记为异步,因此无法返回 SaleItem。它必须返回 void 或对我不起作用的 Task,因为该方法必须返回 SaleItem 以供序列化程序将其转换为 JSON 并将其返回给客户端。

我该如何解决这个问题?

另一个相关问题:

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

【问题讨论】:

  • 您可以创建GetItemDetails 方法async 并从中返回Task&lt;SaleItem&gt;。 WCF 会理解这种形式的合同:stackoverflow.com/q/22623922/1768303
  • @Noseratio:如果是这样的话,调用者会如何表现?例如:如果我要从 iOS 应用程序调用 GetItemDetails,调用(在 iOS 中)会等到我得到响应吗?如果是这样,这是谁做的?我的意思是把异步调用转为同步?
  • 客户端异步完全独立于服务器异步。在服务器完全处理请求(同步或异步)之前,客户端不会收到来自服务器的响应。更多详情,请查看:stackoverflow.com/q/22638828/1768303

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


【解决方案1】:

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

它会起作用的。来自MSDN

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

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

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

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

在某些情况下,您的方法 async 不是必需的,只需返回名为 Task 的内部就足够了,您可以在此处阅读更多信息:Any difference between "await Task.Run(); return;" and "return Task.Run()"?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-11
    • 1970-01-01
    • 2016-12-12
    • 2020-05-03
    • 2023-03-25
    • 2014-11-01
    • 1970-01-01
    • 2017-01-03
    相关资源
    最近更新 更多