在使用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?
假设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()"?