首页 > 解决方案 > 向 API 发送更新请求时,WebUI 无休止地挂起

问题描述

我有 2 个独立的应用程序,一个 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 也可以,我只是找不到适合我的示例。

标签: c#asp.net-mvcasp.net-mvc-5

解决方案


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

string TicketUpdateResult = updateTicket(postedTicket).Result;

return response.Content.ReadAsStringAsync().Result;

这些代码行应该是:

string TicketUpdateResult = await updateTicket(postedTicket);

return await response.Content.ReadAsStringAsync();

推荐阅读