繁体   English   中英

C# ASP.NET Core Web API:如何在controller调用不同方法之间保持上下文

[英]C# ASP.NET Core Web API: How to maintain context in the controller between calling different methods

C# ASP.NET 核心 Web API:一般新手问题。 尝试实现基本的异步请求-回复模式。 基本思想是:

  1. 客户端使用一些负载调用POST {url}/DataProcessor/DataX
  2. 客户端使用GET {url}/DataProcessor/DataXStatus检查交易状态,直到返回 HTTP 状态码200
  3. 客户端从上面的响应中获取xActionId ,然后调用GET {url}/DataProcessor/GetResults/{xActionId}来获取数据处理的结果。

这是我的 controller 的样子:当我调用DataXStatus方法时(在正确调用DataX方法之后),_processData 不在正确的_processData中,就像它在DataX方法完成后从 scope 中消失了。 我究竟做错了什么? 任何一种方法完成后DataProcessorController object 是否消失? 这样做的正确方法是什么?

提前致谢

[Route("[controller]")]
[ApiController]
public class DataProcessorController : ControllerBase
{
    private ProcessData _processData = new ProcessData() ;

    [HttpPost]
    [Route("DataX")]
    public IActionResult DataX([FromBody] xData value)
    {
        _processData.CalculateResult(value);
        return Accepted();
    }

    [HttpGet]
    [Route("DataXStatus")]
    public IActionResult DataXStatus()
    {
        if(_processData.IsRunning())
        {
            return Accepted();
        }
        return Ok(new xDataStatus(){id = _processData.GetxActionId()});
    }

    [HttpGet]
    [Route("GetResults/{xActionId}")]
    public IActionResult GetResults(string xActionId)
    {
        return Ok(new xDataResults(){resX = _processData.GetResults()});
    }
}

在我的手机上回答这个问题,所以请原谅任何错别字。

基本上,是的,class 会根据每个请求重新染色。 api 不会保留以前请求的上下文,除非您跟踪的 object 是 static,这是我的第一个解决方案:

快速而肮脏的选择:

我建议您为此使用依赖注入。 这使您可以选择将“processData”class 作为 singleton 运行。这基本上意味着它是 static。

更好的选择:

另一种更正确的方法是为此使用已知的库。 web api 中有大量用于处理异步请求的库。 我认为你应该为此使用 hangfire,它需要几分钟的时间来设置并且还有大量的配置选项。

https://docs.hangfire.io/en/latest/getting-started/as.net-core-applications.html

如果您需要任何进一步的帮助,请告诉我!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM