如何在服务中调用异步任务<ActionResult> 方法?
Posted
技术标签:
【中文标题】如何在服务中调用异步任务<ActionResult> 方法?【英文标题】:How to Call Async Task<ActionResult> Method in a Service? 【发布时间】:2021-10-01 18:15:24 【问题描述】:我在 CompanyInfoController
中有一个 async Task<ActionResult>
方法,我想在服务类 (ProductService
) 中调用此方法。如何调用此方法并在服务方法中使用结果列表 (companyInfo
)?
[HttpPost]
[Route("GetCompanyInfo")]
public async Task<ActionResult> GetCompanyInfo(List<int> companyId)
var section = this._configuration.GetSection("Company");
string uri = section.GetValue<string>("Host");
string endpoint = section.GetValue<string>("CompanyInfo");
using (var httpClient = new HttpClient())
string idContent = JsonConvert.SerializeObject(companyId);
httpClient.BaseAddress = new Uri(uri);
HttpResponseMessage responseMessage = await httpClient.PostAsync(endpoint, new StringContent(idContent, Encoding.UTF8, "application/json"));
if (responseMessage.IsSuccessStatusCode)
var content = await responseMessage.Content.ReadAsStringAsync();
var operationResult = JsonConvert.DeserializeObject<CompanyInfoResultJSON>(content);
var companyInfo = operationResult.CompanyInfo.SelectMany(x => x.CompanyInfoList).ToList();
return Ok(companyInfo);
else
return BadRequest();
我的ProductService
:
public class ProductService : IProductService
private readonly DBContext _dbContext;
public ProductService(DBContext dbContext)
this._ dbContext = dbContext;
public IEnumerable<Products> GetCompanyProductList(List<int> companyId)
DateTime today = DateTime.Today;
var products =_ dbContext.Products.Where(x => x.ProductionDate < today).ToList();
foreach (item in companyId)
if (products.Any(x => x.companyId == item.companyId)
foreach (product in products)
products.CompanyName =??
// In here, I want to get the companyInfoList elements.
return products;
【问题讨论】:
你能发布产品服务吗?并指出您将在哪里使用该操作。我怀疑服务需要 ActionResult 方法。 @Serge 我将编辑帖子,我需要 companyInfo 列表来更新产品列表的某些行。 旁注.... 不要在using
块/语句中使用 HttpClient 并且不要丢弃它。互联网上有大量资源,因此解释了原因。
为什么不在控制器中依赖IProductService
,然后调用方法?
【参考方案1】:
您必须创建返回 API 结果的特殊方法并将其放在 Common 类中,例如:
public static async Task<List<CompanyInfo>> GetCompanyInfo(List<int> companyId)
if (responseMessage.IsSuccessStatusCode)
companyInfo;
else
return null;
之后你可以从你的控制器调用它
HttpPost]
[Route("GetCompanyInfo")]
public async Task<ActionResult> GetCompanyInfo(List<int> companyId)
var companyInfo=Common.GetCompanyInfo(companyId);
if (responseMessage.IsSuccessStatusCode)
return Ok(companyInfo);
else
return BadRequest("Not found");
同样的方式你可以从你的服务中调用它
还有另一种可能更适合您的方式。在这种情况下,您不需要 Common
public class ProductService:IProductService
public async Task<List<CompanyInfo>> GetCompanyInfo(List<int> companyId)
.... the same code as it in Common above
和你的控制器
public class CompanyController : Controller
private readonly IProductService _service
public CompanyController(IProductService service)
_service=service;
HttpPost]
[Route("GetCompanyInfo")]
public async Task<ActionResult> GetCompanyInfo(List<int> companyId)
.... _service.GetCompanyInfo
【讨论】:
Thnx,它有效,我尝试了第二种解决方案。但我想,我应该使用第一个,因为我在其他服务中需要这个 companyInfoList。 您也可以合并第一个和第二个。这取决于。以上是关于如何在服务中调用异步任务<ActionResult> 方法?的主要内容,如果未能解决你的问题,请参考以下文章
鉴于所有调用都是异步的,您如何在 lambda 中构建顺序 AWS 服务调用?