我正在使用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;或无效?
答案 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
,并且返回类型为Task
,Task<T>
或void
。请注意,void
返回async
方法仅用于异步事件处理程序的兼容性,不应在该范围之外使用。
在某些情况下,让您的方法async
不是必然的,只需返回内部调用Task
即可,您可以在此处详细了解:Any difference between "await Task.Run(); return;" and "return Task.Run()"?