来自控制器的HttpClient PostAsync没有结果

时间:2017-03-19 23:34:24

标签: c# .net asp.net-mvc async-await

我想知道在从控制器调用的情况下我不需要PostAsync调用结果的场景中究竟发生了什么。 /> 例如,我有一些行动

[HttpPost]
public ActionResult DoSomething(SomeModel model)
{
    ...
    PostDataFireAndForget(model);
    ...
    return new EmptyResult();
}

private void PostDataFireAndForget(SomeModel model)
{
    try
    {
        using (var client = new HttpClient())
        {
            string targetUrl="SomeUrl";
            client.PostAsync(targetUrl, new FormUrlEncodedContent(model.Content));
        }
    }

    catch (Exception ex)
    {
        //we didn't care about the response, no additional requirements here
        //ignore
    }
}

所以,我想知道它将如何进行以及为什么在所有可能的情况下。最有趣的一个是PostAsync比其后所有其他动作代码花费更长时间的场景,因此在PostAsync完成之前动作完成。它会被终止/阻止/完成吗?如果我想在行动中执行某种异步操作并且不想等待结果,有没有更好的方法?

2 个答案:

答案 0 :(得分:1)

使fire和forget方法始终异步,以便可以捕获并忽略异常。在其当前的设计中,它可能导致主要动作请求的线程崩溃。

private async Task PostDataFireAndForgetAsync(SomeModel model) 
    try {
        using (var client = new HttpClient()) {
            var targetUrl="SomeUrl";
            await client.PostAsync(targetUrl, new FormUrlEncodedContent(model.Content));
        }
    } catch (Exception ex) {
        //we didn't care about the response, no additional requirements here
        //ignore
    }
}

通过使其异步,该方法可以处理(或在这种情况下不处理)异常并让其他线程继续。

[HttpPost]
public ActionResult DoSomething(SomeModel model) {
    //... fire and forget
    PostDataFireAndForgetAsync(model);
    //...
    return new EmptyResult();
}

答案 1 :(得分:0)

总是调用函数/方法来处理输入并显示输出,如果您需要结果则不相关。如果您不想等待结果,则必须至少等待该过程完成,即使您希望忽略该结果。

在您的方案中,您正在发出请求并离开而没有任何结果,尽管所有UI进程可能已完成并退出,但应用程序将保留在内存中,直到异步完成为止。最好在完全结束所有例程之前等待异步完成。