C# WebAPI:在业务逻辑中使用异步方法

C# WebAPI:在业务逻辑中使用异步方法,c#,asp.net-web-api,async-await,C#,Asp.net Web Api,Async Await,目的是使控制器在我的自定义服务中使用异步方法 控制器: [Route("api/data/summary")] [HttpGet] public async Task<IHttpActionResult> Get() { var result = await DataService.GetDataObjects(); return Ok(result); } [HttpGet] [Route("api/data/summary")] public async Tas

目的是使控制器在我的自定义服务中使用异步方法

控制器:

[Route("api/data/summary")]
[HttpGet]
public async Task<IHttpActionResult> Get()
{
    var result = await DataService.GetDataObjects();
    return Ok(result);
}
[HttpGet]
[Route("api/data/summary")]
public async Task<IHttpActionResult> Get()
{
    var result = await DataService.GetDataObjects().ConfigureAwait(false);
    return Ok(result);
}
[路线(“api/数据/摘要”)]
[HttpGet]
公共异步任务Get()
{
var result=await DataService.GetDataObjects();
返回Ok(结果);
}
服务:

public static async Task<IEnumerable<DataObject>> GetDataObjects()
{
    var apiKey = "some-api-key";
    var path = "path-to-external-service";
    using (var client = new HttpClient())
    {
        var dataToProcess = // some data object

        client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", apiKey);
        client.BaseAddress = new Uri(path);

        HttpResponseMessage response = await client.PostAsJsonAsync("", dataToProcess);
        var content = await response.Content.ReadAsStringAsync();

        var result = MakeEntities(content); // some logic

        return result;
    }
}
public static async Task<ResponseEntity> GetDataObjects()
{
    ResponseEntity response = new ResponseEntity();
    var apiKey = "some-api-key";
    var path = "path-to-external-service";
    using (var client = new HttpClient())
    {
        var dataToProcess = // some data object    
        client.BaseAddress = new Uri(path);
        client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", apiKey);
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));    
        HttpResponseMessage response = await client.PostAsJsonAsync("", dataToProcess).ConfigureAwait(false);
        string responseString = await response.Content.ReadAsStringAsync().ConfigureAwait(false);    
        var result = JsonConvert.DeserializeObject<ResponseEntity>(responseString);

        return response;
    }
}
公共静态异步任务GetDataObjects() { var apiKey=“某些api密钥”; var path=“外部服务的路径”; 使用(var client=new HttpClient()) { var dataToProcess=//某些数据对象 client.DefaultRequestHeaders.Authorization=新的AuthenticationHeaderValue(“承载者”,apiKey); client.BaseAddress=新Uri(路径); HttpResponseMessage response=wait client.postsjsonasync(“,dataToProcess”); var content=await response.content.ReadAsStringAsync(); var result=MakeEntities(content);//一些逻辑 返回结果; } } 但我遇到了一个问题,控制器的操作在服务实际完成数据处理之前返回空结果


您能建议如何正确地实现它吗?

您的代码正常,控制器在
GetDataObjects
返回值之前似乎没有返回值

除下列情况外:

  • MakeEntities
    使用一些异步操作,您不需要在MakeEntities中等待它。所以
    MakeEntities
    返回任务

  • 代码运行时出现异常。确保
    GetDataObjects
    MakeEntities
    code工作正常


  • 您的代码正常,控制器在
    GetDataObjects
    返回值之前似乎没有返回值

    除下列情况外:

  • MakeEntities
    使用一些异步操作,您不需要在MakeEntities中等待它。所以
    MakeEntities
    返回任务

  • 代码运行时出现异常。确保
    GetDataObjects
    MakeEntities
    code工作正常


  • 目的是使控制器在我的自定义服务中使用异步方法

    控制器:

    [Route("api/data/summary")]
    [HttpGet]
    public async Task<IHttpActionResult> Get()
    {
        var result = await DataService.GetDataObjects();
        return Ok(result);
    }
    
    [HttpGet]
    [Route("api/data/summary")]
    public async Task<IHttpActionResult> Get()
    {
        var result = await DataService.GetDataObjects().ConfigureAwait(false);
        return Ok(result);
    }
    
    [HttpGet]
    [路线(“api/数据/摘要”)]
    公共异步任务Get()
    {
    var result=await DataService.GetDataObjects().ConfigureAwait(false);
    返回Ok(结果);
    }
    
    服务:

    public static async Task<IEnumerable<DataObject>> GetDataObjects()
    {
        var apiKey = "some-api-key";
        var path = "path-to-external-service";
        using (var client = new HttpClient())
        {
            var dataToProcess = // some data object
    
            client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", apiKey);
            client.BaseAddress = new Uri(path);
    
            HttpResponseMessage response = await client.PostAsJsonAsync("", dataToProcess);
            var content = await response.Content.ReadAsStringAsync();
    
            var result = MakeEntities(content); // some logic
    
            return result;
        }
    }
    
    public static async Task<ResponseEntity> GetDataObjects()
    {
        ResponseEntity response = new ResponseEntity();
        var apiKey = "some-api-key";
        var path = "path-to-external-service";
        using (var client = new HttpClient())
        {
            var dataToProcess = // some data object    
            client.BaseAddress = new Uri(path);
            client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", apiKey);
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));    
            HttpResponseMessage response = await client.PostAsJsonAsync("", dataToProcess).ConfigureAwait(false);
            string responseString = await response.Content.ReadAsStringAsync().ConfigureAwait(false);    
            var result = JsonConvert.DeserializeObject<ResponseEntity>(responseString);
    
            return response;
        }
    }
    
    公共静态异步任务GetDataObjects() { ResponseEntity response=新ResponseEntity(); var apiKey=“某些api密钥”; var path=“外部服务的路径”; 使用(var client=new HttpClient()) { var dataToProcess=//某些数据对象 client.BaseAddress=新Uri(路径); client.DefaultRequestHeaders.Authorization=新的AuthenticationHeaderValue(“承载者”,apiKey); client.DefaultRequestHeaders.Accept.Add(新的MediaTypeWithQualityHeaderValue(“应用程序/json”); HttpResponseMessage response=await client.PostAsJsonAsync(“,dataToProcess).ConfigureAwait(false); string responseString=await response.Content.ReadAsStringAsync().ConfigureAwait(false); var result=JsonConvert.DeserializeObject(responseString); 返回响应; } }
    目的是使控制器在我的自定义服务中使用异步方法

    控制器:

    [Route("api/data/summary")]
    [HttpGet]
    public async Task<IHttpActionResult> Get()
    {
        var result = await DataService.GetDataObjects();
        return Ok(result);
    }
    
    [HttpGet]
    [Route("api/data/summary")]
    public async Task<IHttpActionResult> Get()
    {
        var result = await DataService.GetDataObjects().ConfigureAwait(false);
        return Ok(result);
    }
    
    [HttpGet]
    [路线(“api/数据/摘要”)]
    公共异步任务Get()
    {
    var result=await DataService.GetDataObjects().ConfigureAwait(false);
    返回Ok(结果);
    }
    
    服务:

    public static async Task<IEnumerable<DataObject>> GetDataObjects()
    {
        var apiKey = "some-api-key";
        var path = "path-to-external-service";
        using (var client = new HttpClient())
        {
            var dataToProcess = // some data object
    
            client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", apiKey);
            client.BaseAddress = new Uri(path);
    
            HttpResponseMessage response = await client.PostAsJsonAsync("", dataToProcess);
            var content = await response.Content.ReadAsStringAsync();
    
            var result = MakeEntities(content); // some logic
    
            return result;
        }
    }
    
    public static async Task<ResponseEntity> GetDataObjects()
    {
        ResponseEntity response = new ResponseEntity();
        var apiKey = "some-api-key";
        var path = "path-to-external-service";
        using (var client = new HttpClient())
        {
            var dataToProcess = // some data object    
            client.BaseAddress = new Uri(path);
            client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", apiKey);
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));    
            HttpResponseMessage response = await client.PostAsJsonAsync("", dataToProcess).ConfigureAwait(false);
            string responseString = await response.Content.ReadAsStringAsync().ConfigureAwait(false);    
            var result = JsonConvert.DeserializeObject<ResponseEntity>(responseString);
    
            return response;
        }
    }
    
    公共静态异步任务GetDataObjects() { ResponseEntity response=新ResponseEntity(); var apiKey=“某些api密钥”; var path=“外部服务的路径”; 使用(var client=new HttpClient()) { var dataToProcess=//某些数据对象 client.BaseAddress=新Uri(路径); client.DefaultRequestHeaders.Authorization=新的AuthenticationHeaderValue(“承载者”,apiKey); client.DefaultRequestHeaders.Accept.Add(新的MediaTypeWithQualityHeaderValue(“应用程序/json”); HttpResponseMessage response=await client.PostAsJsonAsync(“,dataToProcess).ConfigureAwait(false); string responseString=await response.Content.ReadAsStringAsync().ConfigureAwait(false); var result=JsonConvert.DeserializeObject(responseString); 返回响应; } }
    查看代码看起来不像控制器操作可以在服务完成数据处理之前返回结果。你能调试服务并找出预期的输出吗?你使用的ASP.NETWebAPI版本是什么?确保在执行
    GetDataObjects
    过程中没有异常。返回的总是Ok,是否确定应用程序没有引发异常?在
    MakeEntities(content)
    中是否有任何异步函数调用?如果是这样,并且您不使用wait关键字等待它们,那么inside
    result
    变量将为null,并将传递给OKresult@AndreyIschencko,MakeEntities中没有异步内容,从json字符串到objectLooking代码的简单物化看起来不像控制器操作可以在服务完成数据处理之前返回结果。你能调试服务并找出预期的输出吗?你使用的ASP.NETWebAPI版本是什么?确保在执行
    GetDataObjects
    过程中没有异常。返回的总是Ok,是否确定应用程序没有引发异常?在
    MakeEntities(content)
    中是否有任何异步函数调用?如果是这样,并且您不使用wait关键字等待它们,那么inside
    result
    变量将为null,并将传递给OKresult@AndreyIschencko,MakeEntities中没有异步内容,只是从json字符串到对象的简单物化