通过API更新MS Dynamics Business Central项时遇冲突错误求助
解决Dynamics Business Central API更新时的"Another user has already changed the record"错误
你的问题核心是ETag的格式处理错误,具体来说是在curl请求的If-Match头中错误地转义了双引号,导致ETag验证失败,触发并发冲突提示。
问题分析
你从GET请求中获取的ETag是:
"@odata.etag": "W/\"JzE5OzI1NzMyMzIyMjcyOTQ3OTQ4MzExOzAwOyc=\""
这里的\是JSON格式的转义符,实际有效的ETag值是W/"JzE5OzI1NzMyMzIyMjcyOTQ3OTQ4MzExOzAwOyc="。但你在curl的If-Match头里保留了转义符,导致服务器接收到的ETag和记录当前的ETag不匹配,进而报错。
修正步骤
- 提取正确的ETag值:从GET响应中复制
@odata.etag的内容时,去掉JSON的外层引号,保留W/"..."的完整内容,不要手动添加任何转义字符。 - 更新curl命令:将
If-Match头替换为正确的ETag值,示例如下:
curl --location --request PATCH 'https://api.businesscentral.dynamics.com/v2.0/Development/api/v2.0/companies(CompanyNumber)/items(ItemNumber)' \ --header 'If-Match: W/"JzE5OzI1NzMyMzIyMjcyOTQ3OTQ4MzExOzAwOyc="' \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer YOUR_ACCESS_TOKEN' \ --data '{ "inventory":15 }'
关键注意事项
- 每次更新前重新获取ETag:每次执行PATCH操作前,必须先发送GET请求获取目标项的最新
@odata.etag——记录一旦被修改,ETag就会立即更新,旧的ETag直接失效。 - 排查并发修改源:确认没有其他用户或系统进程(比如Business Central客户端的编辑操作)同时修改这条记录,外部修改也会导致ETag变化。
- 代码层面的字符处理:如果是通过程序集成,确保代码在处理ETag字符串时不会自动添加转义符,直接使用响应返回的原始值即可。
内容的提问来源于stack exchange,提问作者Learn AspNet
相关产品推荐
相关产品推荐

