ASP.NET Web API:如何在POST响应中获取插入记录的ID?
如何在POST方法的HTTP响应中获取插入记录的ID?
我看了你提供的代码和遇到的问题,咱们一步步来解决这个问题:
你的控制器方法
先确认下你的后端控制器代码(已格式化):
public HttpResponseMessage POST([FromBody]Map newmap) { try { using (SHATDbEntities entities = new SHATDbEntities()) { entities.Maps.Add(newmap); entities.SaveChanges(); var message = Request.CreateResponse(HttpStatusCode.Created, newmap); message.Headers.Location = new Uri(Request.RequestUri + newmap.Id.ToString()); return message; } } catch (Exception ex) { return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ex); } }
这段代码其实已经做对了两件关键的事:
- 调用
SaveChanges()后,EF会自动把数据库生成的ID赋值给newmap.Id,并将包含ID的对象放入响应体 - 同时把包含新记录ID的资源URL写入了响应的
Location头部
当前响应处理代码的问题
你的客户端代码存在两个明显错误,这也是导致异常的原因:
HttpClient client = new HttpClient(); client.BaseAddress = new Uri("http://localhost:2351/"); client.DefaultRequestHeaders.Accept.Clear(); client.DefaultRequestHeaders.Accept.Add( new MediaTypeWithQualityHeaderValue("application/json")); HttpResponseMessage response = client.PostAsJsonAsync(RequestURI, newmap).Result; int mapid = int.Parse(response.Content.ReadAsStringAsync().Result);
- 变量名错误:你写的
responsestatusCode应该是response - 解析逻辑错误:
ReadAsStringAsync().Result返回的是整个newmap对象的JSON字符串(比如{"Id":123,"Name":"测试地图"...}),直接用int.Parse转换非纯数字字符串必然报错
两种正确的解决方案
方案1:从响应体解析JSON获取ID
既然控制器已经返回了包含ID的Map对象,我们可以直接将响应体反序列化为Map类型,再提取ID:
HttpClient client = new HttpClient(); client.BaseAddress = new Uri("http://localhost:2351/"); client.DefaultRequestHeaders.Accept.Clear(); client.DefaultRequestHeaders.Accept.Add( new MediaTypeWithQualityHeaderValue("application/json")); // 建议用await替代.Result,避免线程阻塞和死锁问题 HttpResponseMessage response = await client.PostAsJsonAsync(RequestURI, newmap); response.EnsureSuccessStatusCode(); // 先确保请求成功 // 反序列化为Map对象 Map createdMap = await response.Content.ReadAsAsync<Map>(); int mapid = createdMap.Id;
方案2:从响应的Location头部提取ID
控制器已经将新资源的URL写入Location头,我们可以解析这个URL的最后一段来获取ID:
HttpClient client = new HttpClient(); client.BaseAddress = new Uri("http://localhost:2351/"); client.DefaultRequestHeaders.Accept.Clear(); client.DefaultRequestHeaders.Accept.Add( new MediaTypeWithQualityHeaderValue("application/json")); HttpResponseMessage response = await client.PostAsJsonAsync(RequestURI, newmap); response.EnsureSuccessStatusCode(); // 获取Location头指向的URI Uri locationUri = response.Headers.Location; // 提取URI的最后一段作为ID字符串 string idStr = locationUri.Segments.Last(); int mapid = int.Parse(idStr);
额外提醒:尽量使用await进行异步调用,而非.Result,后者在UI线程或ASP.NET环境中容易引发死锁问题。
内容的提问来源于stack exchange,提问作者weje
相关产品推荐
相关产品推荐

