UWP应用调用PutAsync()更新数据库对象失败,变更未生效求助
我来帮你梳理这个更新功能失效的问题——你已经搞定了CRUD里的创建、读取、删除功能,就差更新这一步了,这种情况大概率是请求细节或者后端交互的问题,先看看你遇到的场景和可能的解决方向:
问题场景
我正在开发UWP应用,已实现书籍对象的创建、删除、读取/展示功能,但更新功能始终无法生效:编辑文本框里的书籍信息后点击按钮,代码执行无报错、无崩溃,但数据库里的内容完全没变化。
我尝试过的两种无效实现
方法1:直接序列化Book对象发送PUT请求
var existingBook = new Book { Title = TitleBox.Text, Author = AuthorBox.Text, Isbn = IsbnBox.Text, Description = DescBox.Text, Id= int.Parse(IdBox.Text) }; using (var client = new System.Net.Http.HttpClient()) { var json = JsonConvert.SerializeObject(existingBook); var httpContent = new StringContent(json, Encoding.UTF8, "application/json"); var result = await client.PutAsync(App.BaseUri, httpContent); string contentRecieved = await result.Content.ReadAsStringAsync(); }
方法2:用FormUrlEncodedContent封装数据
using (var client = new System.Net.Http.HttpClient()) { var content = JsonConvert.SerializeObject(existingBook); Task task = Task.Run(async () => { var data = new FormUrlEncodedContent( new Dictionary<string, string> { ["value"] = content, ["id"] = App.Books.Id.ToString() } ); await client.PutAsync(App.BaseUri, data); }); task.Wait(); }
关键排查方向与解决方案
1. 检查PUT请求的URI是否包含资源ID
RESTful风格的更新接口通常需要在URL中指定要修改的资源ID,比如App.BaseUri + $"/books/{existingBook.Id}",而不是直接用基础URI。如果你的后端API要求通过路径参数定位资源,当前的请求地址根本找不到要更新的书籍,自然不会有任何变化。
2. 一定要检查响应状态码和返回内容
你已经读取了contentRecieved,但没验证请求是否成功。建议添加日志或用户提示,把状态码和返回内容打出来:
if (!result.IsSuccessStatusCode) { Debug.WriteLine($"更新失败:状态码{result.StatusCode},返回内容:{contentRecieved}"); // 可以在这里给用户弹窗提示失败原因 }
后端很可能返回了404(资源不存在,ID错了)、400(参数格式错误)等状态码,这些信息能直接帮你定位问题。
3. 确认序列化后的JSON是否正确
在序列化后输出JSON字符串,检查ID和字段值是否符合预期:
var json = JsonConvert.SerializeObject(existingBook); Debug.WriteLine("序列化后的Book数据:" + json);
确保Id是要更新书籍的正确ID,没有被错误解析或覆盖,其他字段的内容也和文本框里的一致。
4. 避免Task.Run+Wait()的死锁风险
在UWP的UI线程里用task.Wait()容易引发死锁,建议直接用await简化代码:
using (var client = new HttpClient()) { var content = JsonConvert.SerializeObject(existingBook); var data = new FormUrlEncodedContent( new Dictionary<string, string> { ["value"] = content, ["id"] = existingBook.Id.ToString() } ); var result = await client.PutAsync(App.BaseUri + $"/books/{existingBook.Id}", data); // 后续检查响应逻辑... }
5. 匹配后端API的请求格式要求
如果后端API期望接收JSON格式的请求体,方法2里的FormUrlEncodedContent就会不兼容,导致后端无法解析数据。这种情况下应该用方法1的StringContent并指定application/json类型,同时确保URI包含正确的资源ID。
内容的提问来源于stack exchange,提问作者Strangerest

