C# ASP.NET Core Web API:如何在调用不同方法之间维护控制器中的上下文
C# ASP.NET Core Web API: How to maintain context in the controller between calling different methods
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
对象是否在任何一种方法完成后消失?正确的做法是什么?
提前致谢
[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 都是 re-instaintaited。 api 不会保留先前请求的上下文,除非您跟踪的对象是静态的,这是我的第一个解决方案:
快速而肮脏的选项:
我建议您改用依赖注入。这使您可以选择 运行 您的 'proccessData' class 作为单身人士。这基本上意味着它是静态的。
更好的选择:
另一种更正确的方法是为此使用已知的库。有大量的库是为处理 web api 中的异步请求而构建的。我认为你应该为此使用 hangfire,它需要几分钟的时间来设置并且还有大量的配置选项。
https://docs.hangfire.io/en/latest/getting-started/aspnet-core-applications.html
如果您需要任何进一步的帮助,请告诉我!
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
对象是否在任何一种方法完成后消失?正确的做法是什么?
提前致谢
[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 都是 re-instaintaited。 api 不会保留先前请求的上下文,除非您跟踪的对象是静态的,这是我的第一个解决方案:
快速而肮脏的选项:
我建议您改用依赖注入。这使您可以选择 运行 您的 'proccessData' class 作为单身人士。这基本上意味着它是静态的。
更好的选择:
另一种更正确的方法是为此使用已知的库。有大量的库是为处理 web api 中的异步请求而构建的。我认为你应该为此使用 hangfire,它需要几分钟的时间来设置并且还有大量的配置选项。
https://docs.hangfire.io/en/latest/getting-started/aspnet-core-applications.html
如果您需要任何进一步的帮助,请告诉我!