c# ASP。. NET Core Web API:一般新手问题。尝试实现基本的异步请求-应答模式。基本思想是:
- 客户端调用
POST {url}/DataProcessor/DataX
与一些有效负载 - 客户端使用
GET {url}/DataProcessor/DataXStatus
检查事务的状态,直到返回200
的HTTP状态码 - 客户端从上面的响应中获得
xActionId
,然后调用GET {url}/DataProcessor/GetResults/{xActionId}
来检索数据处理的结果。
这就是我的控制器看起来像:当我调用DataXStatus
方法(在正确调用DataX
方法之后),_processData
不在正确的状态,就像在DataX
方法完成后它已经超出了范围。我做错了什么?DataProcessorController
对象是否在任何一个方法完成后消失?正确的做法是什么?
Thanks in advance
[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()});
}
}
在我的手机上回答这个问题,所以请原谅我的打字错误。
基本上,每个请求都重新恢复类。api不保留以前请求的上下文,除非您正在跟踪的对象是静态的,这是我对此的第一个解决方案:
快捷快捷选项:
我建议你使用依赖注入。这让你可以选择运行你的' processdata '类作为一个单例。这基本上意味着它是静态的。
更好的选择:
另一种更正确的方法是使用已知的库。有大量的库是用来处理web api中的异步请求的。我认为你应该使用hangfire,它需要几分钟的时间来设置,也有大量的配置选项。
https://docs.hangfire.io/en/latest/getting-started/aspnet-core-applications.html
如果你需要进一步的帮助,请告诉我!