gpt4 book ai didi

c# - PutAsync 不向 web api 发送请求,但 fiddler 工作正常

转载 作者:行者123 更新时间:2023-11-30 15:22:10 25 4
gpt4 key购买 nike

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

通过 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,它返回一个 Task<HttpResponseMessage>这表示将来要完成的操作,您需要 await .你正在包装你的 HttpClientusing 里面语句,这意味着在您触发异步 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 公开的.

关于c# - PutAsync 不向 web api 发送请求,但 fiddler 工作正常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36173165/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com