PutAsync 不向 web api 发送请求,但提琴手工作正常

Posted

技术标签:

【中文标题】PutAsync 不向 web api 发送请求,但提琴手工作正常【英文标题】:PutAsync doesn't send request to web api, but fiddler works fine 【发布时间】: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);
    

【问题讨论】:

【参考方案1】:

HttpClient.PutAsync是一个异步API,它返回一个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公开的。

【讨论】:

非常感谢,我忘记了客户端已被处理并且我需要等待 PutAsync 完成这一事实。

以上是关于PutAsync 不向 web api 发送请求,但提琴手工作正常的主要内容,如果未能解决你的问题,请参考以下文章

云功能不向 PubSub 发送消息

jQuery自动完成不向AJAX发送数据

Python Flask 不向客户端发送发射

Codeigniter 抛出错误并且不向用户发送确认邮件

Vue axios 不向服务器发送标头(django simplejwt)

AJAX发布不向laravel控制器发送数据