【问题标题】:How to combine a controller with a listener?如何将控制器与监听器结合起来?
【发布时间】:2019-08-01 12:54:39
【问题描述】:

在我的 .NET Core HttpPost 控制器中,我获取数据。我将进一步传递此数据以进行处理。我只能通过设置监听器才能得到关于处理成功的结果。我想要返回给用户的监听器得到的结果。

但是我怎样才能让控制器等待侦听器并在控制器返回时处理侦听器返回?

用于说明目的的示例:

[HttpPost()]
public async Task<IActionResult> CreatedAsync([FromBody]DataWrapper dataWrapper)
{
    BusinessComponet.CollectData(dataWrapper);
    return returnValueFromListener; // How to do this in real?
}

static void BusinessComponentDeliverResponse(object sender, DeliverEventArgs e)
{
    if(e.IsValid)
        return Ok("received");  // How to use this as return for the controller?
    else
        return BadRequest(e.ErrorMessage); // How to use this as return for the controller?
}

在侦听器中获得结果之前的时间跨度现在大约为 7 秒,我可以在 1 秒内得到它,并进行一些更改。我认为让用户等待结果是可以的。

【问题讨论】:

  • 如果我做对了,你就是在尝试让一个长时间运行的 RPC 通过 HTTP 工作。我会做什么:服务器有一个引用“ResultState”对象的键字典。一个 Post 在那里创建一个条目,并开始处理。 Process 将更新 ResultState 对象。您返回的是资源地址的成功:这是使用密钥作为参数预先配置的结果获取端点。然后客户端可以轮询结果状态。一段时间后,我会删除完成的结果。
  • 您描述的是您如何尝试解决问题,而不是问题本身。 ASP.NET Core 中没有“监听器”,除非您指的是 SignalR。没有事件——它们在服务器应用程序中甚至没有意义。 实际问题是什么?开始一项长期运行的工作并报告进度?向客户端推送通知是 SignalR 的工作。
  • @PanagiotisKanavos 我已经在同一个应用程序中使用 .NET Core 中的侦听器并且它可以工作。
  • @FrankMehlhop 什么听众?您发布的是一个事件处理程序。你的意思是一个 HttpListener 吗?还有什么?

标签: c# .net-core asp.net-core-webapi


【解决方案1】:

我会先说它一个糟糕的想法,你应该重新架构以避免这样做......

您可能真正想要做的是例如将作业插入表或队列中,获取服务或批处理作业来处理它,然后使用 AJAX 轮询结果...

话虽如此,如果您同时坚持这样做,您可以等待结果如下:

[HttpPost()]
public async Task<IActionResult> CreatedAsync([FromBody]DataWrapper dataWrapper)
{
    int timeOut = 0;
    BusinessComponet.CollectData(dataWrapper);
    // Wait for the event handler to fire, with a timeout so it doesn't wait forever
    while (_result == null && timeOut < 20000){
        Thread.Sleep(1000);
        timeOut += 1000;
    }
    return _result;
}

private static IHttpResponse _result = null;

static void BusinessComponentDeliverResponse(object sender, DeliverEventArgs e)
{
    if(e.IsValid)
        _result = Ok("received");  
    else
        _result = BadRequest(e.ErrorMessage); 
}

【讨论】:

    【解决方案2】:

    为了获得一个好的和干净的解决方案,我改变了我的方法,现在正在使用返回值。所以我不需要使用监听器来响应。

    【讨论】:

      猜你喜欢
      • 2018-01-24
      • 2021-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多