You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Xamarin中通过API更新数据无报错但数据库未更新如何解决

问题排查结论
  • 核心错误:PUT请求提交的数据对象不符合接口要求
    你在循环中修改的是单个评分记录r的ViewStorer字段,但序列化提交数据时错误传入了res.RatingStores整个集合对象。你用Postman/Swagger测试时提交的是单个资源对象,接口可以正常解析,而代码中提交集合会触发接口参数校验不通过,自然不会执行更新逻辑。
  • 隐藏问题:未捕获接口响应的错误信息
    你当前的代码没有判断PutAsync的返回状态码,即使接口返回400参数错误、401权限错误等异常状态,只要请求本身发送成功,就不会触发运行时错误,导致你看不到接口的具体报错提示。
  • 其他优化点:
    1. 循环中r.ID = r.ID这类自身赋值的代码完全多余,可直接删除
    2. 不要每次调用方法都实例化新的HttpClient,建议复用静态单例HttpClient避免套接字资源泄漏
修复后参考代码
// 建议将HttpClient改为静态单例,不要在方法内重复实例化
private static readonly HttpClient _client = new HttpClient();

public async Task UpdateViewRatingStore(bool value)
{
    var url = baseUrl + userget;
    _client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", mytokenlogin);
    string jsonStr = await _client.GetStringAsync(url);

    var res = JsonConvert.DeserializeObject<Customer>(jsonStr);
    var checkunredrating = res.RatingStores;

    if (checkunredrating != null)
    {
        foreach (var r in checkunredrating)
        {
            // 删掉多余的自身赋值代码,只保留需要修改的字段
            r.ViewStorer = value;

            var urlput = baseUrlStoreRating + r.ID;
            // 仅序列化当前修改的单个r对象,而非整个集合
            var stringContent = new StringContent(JsonConvert.SerializeObject(r), Encoding.UTF8, "application/json");
            // 接收响应并校验状态
            var response = await _client.PutAsync(urlput, stringContent);
            // 调试时可以打印以下内容查看接口返回信息
            // var statusCode = response.StatusCode;
            // var responseContent = await response.Content.ReadAsStringAsync();
            response.EnsureSuccessStatusCode(); // 接口返回非2xx状态码时会抛出异常,方便定位问题
        }
    }
}

内容的提问来源于stack exchange,提问作者Chim Di Tru

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 01:39:04