代码之家  ›  专栏  ›  技术社区  ›  soomon

当向api发送更新请求时,webui将无休止地挂起[重复]

  •  0
  • soomon  · 技术社区  · 6 年前

    我有两个独立的应用程序,一个MVC5用户界面和一个ASP.NET WebAPI2(不是ASP.NET核心)。我可以很好地从api读取数据。现在我想把数据从ui中的表单发送到api,这样它就可以把数据写到它的数据库中。

    由于内部原因,mvc控制器从表单接收post请求,然后通过将其发送到api来更新数据库中的数据,并显示某种形式的结果(错误或确认)。api接收数据,完成工作,并用200和期望的答案(“updated”)响应。

    不幸的是,用户界面不知怎么的没有意识到这个答案,一直在等待…我已经读过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也可以,我只是找不到一个对我有用的示例。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Nathan Werry    6 年前

    下面的代码行将在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();