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 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 完成这一事实。以上是关于PutAsync 不向 web api 发送请求,但提琴手工作正常的主要内容,如果未能解决你的问题,请参考以下文章