【问题标题】:Return to MVC controller after posting to Web Api发布到 Web Api 后返回 MVC 控制器
【发布时间】:2015-02-05 16:24:59
【问题描述】:

我正在使用此方法从 MVC 控制器向 Web api 控制器方法发布一些数据..

private static async Task<HttpResponseMessage> SendDataToApi (List<TogglRow> input)
    {
        using (var client = new HttpClient())
        {
            client.BaseAddress = new Uri("http://localhost:****/");
            client.DefaultRequestHeaders.Accept.Clear();
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

            var response = await client.PostAsJsonAsync("api/service", input);
            //if (response.StatusCode == HttpStatusCode.OK)
            //{
            //    var resultUri = response.Headers.Location;
            //}
            return response;
        }
    }

这是我要发布到的 Web Api 方法..

public HttpResponseMessage Post(HttpRequestMessage request, List<Dagsrapport> value)
    {
        if (value != null)
        {
            var rapporter = value.ToList();
            //send rapporter to DB
            var response = new HttpResponseMessage(HttpStatusCode.OK);

            return response;
        }
        return request.CreateResponse(HttpStatusCode.BadRequest);
    }

现在,帖子运行良好,我正在返回 HttpStatusCode.OK。但我没有被重定向回我从(SendDataToApi())执行帖子的方法。我正在返回帖子被触发的页面。我可以看到页面正在运行(等待 localhost..),但没有任何反应。

我可能应该提到这是两个独立的项目(MVC 和 WebApi),但在同一个解决方案中。

我错过了什么?

编辑 - 已解决

我遇到的问题是由于运行任务“SendDataToApi”的方法未设置为异步。因此,它没有等待 post 的结果,而是同步运行,并且控件从未返回到运行 SendDataToApi 的方法,而是返回到原始调用者 - UI。

这是运行 SendDataToApi 任务的方法..

[HttpPost]
public async Task<ActionResult> Edit(IEnumerable<TogglRow> tr)
{
    var listToExport = tr.Where(x => x.Export.Equals(true));
    var result = listToExport.ToList();
    var response = await SendDataToApi(result);
    return RedirectToAction("Index", "Home", 
        response.StatusCode == HttpStatusCode.OK ? new { message = "Record(s) were successfully stored." } : new { message = "No records selected." });
}

【问题讨论】:

  • 我不知道您所说的“我没有被重定向回方法”是什么意思?异步会导致控件立即返回给调用者 (UI)。一旦调用 PostAsJsonAsync 返回,编译器将执行调用后的代码(上面有注释)。您还期望实现什么目标?
  • 你说得对,控件返回给 UI。我想我希望控件返回到方法 SendDataToApi() 并且它将继续执行任务,即返回响应;。然后在任务完成后,我将返回到调用 SendDataToApi 的位置。 Wich 是 MVC 控制器中的一个 post 方法。
  • 我应该如何继续实现这一目标? @SBirthare
  • 在 SendDataToApi 方法中尝试 response.Wait(),即强制调用变为同步。
  • 如果我这样做:return await response; 在 SendDataToApi 内,那么我可以设置响应的值为:Id = 12,Status = WaitingForActivation,Method = "{null}" , 结果 = "{尚未处理}"

标签: c# asp.net-mvc asp.net-web-api


【解决方案1】:

您似乎对这一切的运作方式存在一些根本性的误解。 MVC 操作和 WebAPI 操作的工作方式非常不同,这就是为什么它们实际上位于完全不同的命名空间中,尽管它们都实现了相似的组件。

如果您需要从 MVC 操作连接到 Web API,则不应以HttpResponseMessage 形式接收响应。这是 WebAPI 操作的返回值,类似于 ViewResult 是 MVC 操作的返回值。它对 MVC 中的任何内容都没有任何意义。相反,例如,您来自HttpClient 的实际响应将是一个字符串(技术上是字节数组),其内容类型表明它应该被解释为纯文本、JSON、XML 等。

根据内容类型,您将相应地处理此响应。例如,如果它是 JSON,那么您可以使用来自 Newtonsoft.JsonJObject 之类的东西(MVC 中的默认 JSON 解释器)。然后,您可以使用此数据对象为您的 MVC 操作构建响应。如果您有指示应该进行重定向的内容,则 MVC 操作可以返回 Redirect* 系列结果。重要的是,您不能只将 Web API 操作的响应重定向到重定向,因为这只会影响 HttpClient 响应对象。

【讨论】:

  • 感谢您的信息!但我遇到的问题是由于运行任务“SendDataToApi”的方法未设置为 async 。因此,它没有等待 post 的结果,而是同步运行,并且控件从未返回到运行 SendDataToApi 的方法,而是返回到原始调用者 - UI。 @ChrisPratt
猜你喜欢
  • 1970-01-01
  • 2014-11-26
  • 2013-04-30
  • 1970-01-01
  • 1970-01-01
  • 2014-01-27
  • 1970-01-01
  • 2021-11-02
  • 2018-10-17
相关资源
最近更新 更多