【问题标题】:PutAsync doesn't send request to web api, but fiddler works finePutAsync 不向 web api 发送请求,但提琴手工作正常
【发布时间】:2016-03-23 08:32:06
【问题描述】:

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

通过 Mvc 应用程序,put 方法不会被命中,请求不会发生。但是当我在提琴手中测试它时,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);
    }

【问题讨论】:

    标签: c# asp.net async-await asp.net-web-api2 dotnet-httpclient


    【解决方案1】:

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

    你有两个选择。在其中创建 async Task 和 await 方法:

    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公开的。

    【讨论】:

    • 非常感谢,我忘记了客户端已被处理并且我需要等待 PutAsync 完成这一事实。
    猜你喜欢
    • 2015-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 2018-06-24
    • 1970-01-01
    • 2016-05-12
    • 1970-01-01
    相关资源
    最近更新 更多