【问题标题】:Is it possible to call synchronous http post request using ASP.net?是否可以使用 ASP.net 调用同步 http post 请求?
【发布时间】:2021-03-20 10:45:15
【问题描述】:

我有一个场景,其中执行 http POST 请求,调用另一个 get 请求并返回 get 请求的响应。这是我的代码

public class EmployeeController : ControllerBase
{
    private readonly IBusControl _bus;
    public EmployeeController(IBusControl bus)
    {
        _bus = bus;
    }
    [HttpPost]
    public async Task<IActionResult> Emp(EmployeeModel employee)
    {
        Uri uri = new Uri("rabbitmq://localhost/ret_eligibility");

        var endPoint = await _bus.GetSendEndpoint(uri);
        await endPoint.Send(employee);
        return Ok("Success");
    }


    [HttpGet]
    [Route("getRetFund")]
    public IActionResult fund()
    {
        Fund fund = RetFundConsumer.fund;
        return Ok(fund.retfund);
    }
}

我想在 POST 请求方法中调用 getRetFund 请求,这样当使用邮递员将员工数据发送到队列时,它会调用第二个服务来消费消息并发送回响应。然后此响应将显示在控制台中。 我也试过下面的POST方法。

[HttpPost]
    public async Task<IActionResult> Emp(EmployeeModel employee)
    {
        Uri uri = new Uri("rabbitmq://localhost/ret_eligibility");

        var endPoint = await _bus.GetSendEndpoint(uri);
        await endPoint.Send(employee);
        //return Ok("Success");
        Fund fund = RetFundConsumer.fund;
        return Ok("your retirement fund is " + fund.retfund);
    }

但这会抛出空异常,因为它在执行 POST 请求之前调用第二个服务。我们将不胜感激。

【问题讨论】:

    标签: asp.net httprequest microservices masstransit


    【解决方案1】:

    这永远行不通。您需要花时间了解 Web API 请求处理范围和 MassTransit 消息处理范围。

    简而言之,Web API 和 MassTransit 消息处理都局限于一条消息。您无法使用响应消息,以某种方式神奇地保持 HTTP 会话打开。消费者在处理完消息后被释放。

    您可以这样做,但您需要使用 MassTransit request/response feature

    public class EmployeeController : ControllerBase
    {
        private readonly IRequestClient<EmployeeModel> _client;
        public EmployeeController(IClientFactory clientFactory)
            => _client = clientFactory.CreateRequestClient<EmployeeModel>(
                new Uri("rabbitmq://localhost/ret_eligibility"));
    
        [HttpPost]
        public async Task<IActionResult> Emp(EmployeeModel employee)
        {
            var response = await _client.GetResponse<Fund>(employee);
            return Ok("your retirement fund is " + fund.retfund);
        }
    }
    

    当然,您需要相应地更改您的消费者以发回消息。有关详细信息,请查看上面引用的文档。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-11
      • 2014-08-16
      相关资源
      最近更新 更多