删除Document DB文档成功但无响应资源,ResourceResponse返回为空求助
嘿,我来帮你捋清楚这个问题!
为啥
resp.Resource会是null? 你这情况其实是Cosmos DB SDK的正常行为——当删除文档操作成功完成后,服务端不会返回被删除的文档资源,毕竟文档已经被删掉了,没东西可返回嘛。所以你直接调用resp.Resource.ToString()肯定会触发空引用异常,这完全是预期外的调用导致的问题。
成功删除后,
ResourceResponse里到底有啥有用信息? 虽然Resource字段是null,但ResourceResponse对象依然带着一堆关键的操作元数据,这些才是你应该关注的:
StatusCode:HTTP状态码,成功删除会返回204 No ContentRequestCharge:这次操作花了多少RU(请求单位),用来算成本很有用ActivityId:Cosmos DB服务端生成的唯一操作ID,出问题的时候找官方排查全靠它ETag:被删文档的最后版本标识,哪怕文档没了,这个值还是能拿到RetryCount:操作有没有被自动重试过,重试了几次Diagnostics:请求的详细诊断日志,比如请求耗时、服务端响应细节,排查慢请求必备
修正后的代码示例
你需要先判断resp.Resource是否为空,再决定要不要调用它的方法,同时正确用状态码判断操作结果:
var uri = UriFactory.CreateDocumentUri(dbName, colName, id); var resp = await client.DeleteDocumentAsync(uri); // 先判断Resource是否存在,避免空引用炸锅 if (resp.Resource != null) { response.Message = resp.Resource.ToString(); } else { response.Message = "文档已成功删除,无返回资源"; } // 划重点:删除成功的状态码是204,不是常见的200哦 if (resp.StatusCode == System.Net.HttpStatusCode.NoContent) { // 这里放删除成功后的逻辑,比如更新缓存、打日志 Console.WriteLine($"删除搞定!消耗了{resp.RequestCharge}个RU,ActivityID: {resp.ActivityId}"); } else { // 处理删除失败的情况,比如文档不存在、权限不够 Console.WriteLine($"删除失败啦!状态码: {resp.StatusCode},诊断信息: {resp.Diagnostics}"); }
额外提一句:如果你确实需要保留被删文档的内容,可以在删除前先调用ReadDocumentAsync把文档读出来存好,再执行删除操作,这样就能拿到完整的文档数据啦。
内容的提问来源于stack exchange,提问作者erad
相关产品推荐
相关产品推荐

