【发布时间】: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