我正在使用此方法从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." });
}
答案 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*
响应对象。