向API发送更新请求时,WebUI无休止地挂起



我有两个独立的应用程序,一个MVC5 UI和一个Asp.net WebApi2(不是Asp.net核心(。我可以从API读取数据。现在我想将数据从UI中的表单发送到API,这样它就可以将数据写入它的数据库。

由于内部原因,MVC控制器从表单接收POST请求,然后通过将其发送到API来更新数据库中的数据,并显示某种形式的结果(错误或确认(。API接收数据,完成工作,并以200和所需答案("更新"(进行响应。

遗憾的是,用户界面不知何故没有意识到这个答案,并一直在等待。。。我读到过会有90秒的超时,但事实似乎并非如此。我必须强调,我是一个新手,所以我想我犯了一些奇怪的错误:D

我使用的代码在控制台应用程序中运行良好,但要么我把它搞砸了,要么它在WebApi中根本不起作用?我试着设置超时,但它没有改变任何东西:/

最后一个日志条目是:正在向api发送更新请求。。。

控制器代码:

[HttpPost]
public ActionResult EditTicket(ServiceManagementTicket postedTicket)
{
if (!ModelState.IsValid)
{
// some error handling code
}

string TicketUpdateResult = updateTicket(postedTicket).Result;
if (TicketUpdateResult == "updated")
{
return View("SingleTicketView", postedTicket);
}
else
{
Log.Verbose("ticket could not be updated. The error should have been logged");
return View("Views/Pages/InternalServerError");
}
}

任务代码:

public static async Task<string> updateTicket(ServiceManagementTicket postedTicket)
{

string FinalEndpoint = "api url here"

String jsonToExport = JsonConvert.SerializeObject(postedTicket);
StringContent jsonToExportConverted =
new StringContent(jsonToExport, Encoding.UTF8, "application/json");
Log.Verbose("Trying to update ticket at: " + FinalEndpoint);

try
{
using (var client = new HttpClient())
{
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/json"));
client.Timeout = TimeSpan.FromSeconds(5);
Log.Verbose("sending update request to api...");
HttpResponseMessage response = await client.PutAsync(
FinalEndpoint,
jsonToExportConverted);

Log.Verbose("Updating the Ticket at the webapi was: " + response.ReasonPhrase);
if (response.ReasonPhrase == "updated")
{
Log.Verbose("api confirmed the update");
return response.Content.ReadAsStringAsync().Result;
}
Log.Verbose("something ent wrong :/");
return "error";
}
}
catch (Exception e)
{
// error handling
}
}

在同步调用中将数据发送到api也可以,我只是找不到适合我的示例。

下面的代码行将在ASP.NET应用程序中死锁,永远不要在ASP.NET应用中使用Task.Result

string TicketUpdateResult = updateTicket(postedTicket).Result;
return response.Content.ReadAsStringAsync().Result;

这些代码行应该是:

string TicketUpdateResult = await updateTicket(postedTicket);
return await response.Content.ReadAsStringAsync();

最新更新