如何在服务中调用异步任务<ActionResult> 方法?

Posted

技术标签:

【中文标题】如何在服务中调用异步任务<ActionResult> 方法?【英文标题】:How to Call Async Task<ActionResult> Method in a Service? 【发布时间】:2021-10-01 18:15:24 【问题描述】:

我在 CompanyInfoController 中有一个 async Task&lt;ActionResult&gt; 方法,我想在服务类 (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 服务调用?

如何知道以编程方式在我当前的应用程序中运行了多少异步任务/服务?

如何使用 XCTestCases 实现异步任务依赖?

如何调用异步任务 方法?

按任务调用异步操作

Web API 服务 - 如何在异步任务中使用“HttpContext.Current”