【发布时间】: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<SaleItem>。 WCF 会理解这种形式的合同:stackoverflow.com/q/22623922/1768303 -
@Noseratio:如果是这样的话,调用者会如何表现?例如:如果我要从 iOS 应用程序调用 GetItemDetails,调用(在 iOS 中)会等到我得到响应吗?如果是这样,这是谁做的?我的意思是把异步调用转为同步?
-
客户端异步完全独立于服务器异步。在服务器完全处理请求(同步或异步)之前,客户端不会收到来自服务器的响应。更多详情,请查看:stackoverflow.com/q/22638828/1768303。
标签: c# .net wcf task-parallel-library async-await