C# 在使用wait的WCF方法中返回项

C# 在使用wait的WCF方法中返回项,c#,.net,wcf,task-parallel-library,async-await,C#,.net,Wcf,Task Parallel Library,Async Await,我正在使用WCF创建一个RESTful web服务。考虑服务合同和以下实施: [ServiceContract] public interface IItemsSaleService { [OperationContract] [WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped, UriT

我正在使用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;
        }
[服务合同]
公共接口IItemsSaleService
{
[经营合同]
[WebInvoke(Method=“GET”,ResponseFormat=WebMessageFormat.Json,BodyStyle=WebMessageBodyStyle.Wrapped,UriTemplate=“getItemDetails/{itemId}”)]
SaleItem GetItemDetails(字符串itemId);//获取
}
//实施
async public SaleItem GetItemDetails(string itemId)//这不起作用。这应该是一项艰巨的任务
{
SaleItem项目=等待FindItem(项目ID);
退货项目;
}
假设FindItem是第三方API方法。因为我使用的是wait,所以GetItemDetails方法必须标记为async,因此无法返回SaleItem。它必须返回void或一个对我不起作用的任务,因为该方法必须返回SaleItem,以便序列化程序将其转换为JSON并返回给客户端

我该如何解决这个问题

另一个相关问题:

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

假设FindItem是第三方API方法。因为我使用的是wait,所以GetItemDetails方法必须标记为async,因此无法返回SaleItem。它必须返回void或一个对我不起作用的任务,因为该方法必须返回SaleItem,以便序列化程序将其转换为JSON并返回给客户端

它会起作用的。发件人:

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

这意味着WCF可以为单个消息在同步和异步模式之间切换。链接中提供了广泛的答案:

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

异步方法本质上是一路向上传播的。使用
wait
关键字的方法必须将其方法标记为
async
,返回类型为
Task
Task
void
。请注意,
void
returning
async
方法仅用于异步事件处理程序的兼容性,不应在该范围之外使用


有些情况下,不需要使方法
异步
,只需返回内部调用的
任务
就足够了,您可以在此处阅读更多信息:

您可以使
GetItemDetails
方法
异步
并从中返回
任务
。WCF将理解这种形式的合同:@Noseratio:如果是这样,调用方将如何行事?例如:如果我从iOS应用程序调用GetItemDetails,调用(在iOS中)会等到我得到响应吗?如果是,是谁做的?我的意思是将异步调用转换为sync?客户端上的异步完全独立于服务器上的异步。在服务器(同步或异步)完全处理请求之前,客户端不会从服务器接收响应。有关详细信息,请检查此:。