发布到Web Api后返回MVC控制器

时间:2015-02-04 11:13:04

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

我正在使用此方法从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”的方法未设置为异步。因此,它没有等待帖子的结果,而是同步运行,控件从未返回到运行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." });
}

1 个答案:

答案 0 :(得分:0)

似乎你对这一切是如何运作有一些根本的误解。 MVC操作和WebAPI操作的工作方式截然不同,这就是为什么它们实际上处于完全不同的命名空间中,即使它们都实现了类似的组件。

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

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