【问题标题】:Call a function in controller after returning response from ActionMethod从 ActionMethod 返回响应后调用控制器中的函数
【发布时间】:2018-10-22 05:26:24
【问题描述】:

我正在做一个 Ajax 调用,它调用如下操作方法-

action 方法在完成一些工作后返回响应。
将此响应提交回 Ajax 调用后,我想调用另一个方法。

 $.ajax({
        url: "/Test/TestActionMethod"; ,
        data: somejsondata,
        dataType: "json",
        type: 'POST',
        async: true,
        contentType: 'application/json; charset=utf-8',
        success: function (response) {

        }
});

这是我的行动方法

public JsonResult TestActionMethod(bool test1, bool test2)
{  
      object response = null;
      // some code

      return Json(response, JsonRequestBehavior.AllowGet);

      Save(); // Here I want to call this method
}

我知道我不能像这样调用 Save() 方法我也知道我们可以进行另一个 ajax 调用来调用此保存方法但是,我正在寻找可以在控制器本身中调用此保存方法的方法而不是进行另一个 Ajax 调用。

有什么办法吗?

[附注我不想在提交响应之前调用它,因为此函数需要时间,因此响应时间也会增加]

【问题讨论】:

  • 你能在TestActionMethod添加一些代码吗?
  • @ershoaib 这是一个相当长的代码,但它运行良好。我只想在提交响应后调用 Save()
  • 为什么不在return Json( 之前调用Save();
  • @ChetanRanpariya 我在问题中提到 Save() 函数需要时间来执行,所以如果我在返回响应之前调用它,响应时间会增加。所以我只想先返回响应,然后进行长时间运行的函数调用。
  • 只调用 Task.Run(Save) 怎么样,这将是一个简单的火灾和忘记,并且会在 return Json() 之前;

标签: c# .net ajax asp.net-mvc-3


【解决方案1】:

在返回之前使用 Task.Run() 触发并忘记。

public async Task<IActionResult> ActionName()
{
    Task.Run(() => Save());
    return Ok();
}

private void Save()
{
    Thread.Sleep(5000);
}

【讨论】:

    【解决方案2】:

    Controller Action 方法返回后无法执行代码。

    您可以使用后台worker异步触发计时功能。

    //Save method which will be taking time.
    private void Save(CancellationToken ct)
    {
        if (ct.IsCancellationRequested)
                return;
    
        // Long running code of saving data.. 
    }
    
    
    public JsonResult TestActionMethod(bool test1, bool test2)
    {  
        object response = null;
        // some code
    
        // Initiating background work item to execute Save method.
        HostingEnvironment.QueueBackgroundWorkItem(ct => Save(ct));
    
        return Json(response, JsonRequestBehavior.AllowGet);
    }
    

    【讨论】:

    • hostingenvironment does not contain a definition for queuebackgroundworkitem 即使在使用 Syatem.Web.Hosting 命名空间后我也会收到此错误
    • 您使用的是什么版本的 System.Web?
    猜你喜欢
    • 2022-11-23
    • 1970-01-01
    • 2023-03-26
    • 2017-01-28
    • 1970-01-01
    • 2020-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多