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关键字等待它们,那么insideresult
变量将为null,并将传递给OKresult@AndreyIschencko,MakeEntities中没有异步内容,从json字符串到objectLooking代码的简单物化看起来不像控制器操作可以在服务完成数据处理之前返回结果。你能调试服务并找出预期的输出吗?你使用的ASP.NETWebAPI版本是什么?确保在执行GetDataObjects
过程中没有异常。返回的总是Ok,是否确定应用程序没有引发异常?在MakeEntities(content)
中是否有任何异步函数调用?如果是这样,并且您不使用wait关键字等待它们,那么insideresult
变量将为null,并将传递给OKresult@AndreyIschencko,MakeEntities中没有异步内容,只是从json字符串到对象的简单物化