PutAsync 不向网络发送请求 api,但 fiddler 工作正常

PutAsync doesn't send request to web api, but fiddler works fine

几个小时以来,我一直在努力找出问题所在,但就是找不到问题所在。

通过 Mvc 应用程序,put 方法不会被命中,请求不会发生。但是当我在 fiddler 中测试它时,api 中的 PutMethod 工作。

希望有人能帮我解决问题。

也欢迎指点更好的结构或一些好的文档。

    public void UpdateWerknemerCompetentieDetail(int wnID, int WNC, CompetentieWerknemerDetail detail)
    {
        using (HttpClient client = new HttpClient())
        {
            string token = (string)HttpContext.Current.Session["token"];
            client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
            var wn = GetWerknemerById(wnID);
            //var wnc = wn.CompetentiesWerknemer.Select(c => c).Where(c => c.ID == WNC).FirstOrDefault();
            detail.CompetentieWerknemerID = WNC;
            //wnc.CompetentieWerknemerDetail = detail;
            var url = String.Format(URL + "PutDetails?id=" + WNC);
             var json = JsonConvert.SerializeObject(detail, new JsonSerializerSettings()
             {
                 ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore
             });         
            var response =  client.PutAsync(url, new StringContent(json, Encoding.UTF8, "application/json"));

        }
    }

以上代码是我的服务,应该向 api 发出请求。

这里是 web api IHttpActionResult 方法(put 方法)。

    [Route("PutDetails")]
    [HttpPut]
    public IHttpActionResult PutWerknemerCompetentieDetails(int id, [FromBody]CompetentieWerknemerDetail cwn)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

        if (id != cwn.CompetentieWerknemerID)
        {
            return BadRequest();
        }

        //_db.Entry(cwn).State = EntityState.Modified;

        try
        {
            _db.CompetentieWerknemerDetail.Add(cwn);
            _db.SaveChanges();
        }
        catch (DbUpdateConcurrencyException)
        {
            if (!WerknemerExist(id))
            {
                return NotFound();
            }
            else
            {
                throw;
            }
        }

        return StatusCode(HttpStatusCode.NoContent);
    }

HttpClient.PutAsync是一个异步的API,它returns一个Task<HttpResponseMessage>表示一个将来要完成的操作,你需要await.您将 HttpClient 包装在 using 语句中,这意味着在您触发异步 PUT 之后,您正在处理导致请求和对象处理出现竞争条件的客户端,这可能是您没有看到请求触发的原因。

你有两个选择。要么在其中创建方法 async Taskawait

public async Task UpdateWerknemerCompetentieDetailAsync(
        int wnID, int WNC, CompetentieWerknemerDetail detail)
{
    using (HttpClient client = new HttpClient())
    {
        string token = (string)HttpContext.Current.Session["token"];
        client.DefaultRequestHeaders.Authorization = 
                new AuthenticationHeaderValue("Bearer", token);
        var wn = GetWerknemerById(wnID);
        //var wnc = wn.CompetentiesWerknemer.Select(c => c)
        //                                  .Where(c => c.ID == WNC)
        //                                  .FirstOrDefault();

        detail.CompetentieWerknemerID = WNC;
        //wnc.CompetentieWerknemerDetail = detail;
        var url = String.Format(URL + "PutDetails?id=" + WNC);
        var json = JsonConvert.SerializeObject(detail, new JsonSerializerSettings()
        {
             ReferenceLoopHandling = ReferenceLoopHandling.Ignore
        });         
        var response = await client.PutAsync(
            url, new StringContent(json, Encoding.UTF8, "application/json"));

    }
}

或者使用同步API,比如WebClient.