Acumatica升级21.203.0030后REST API上传文件报Sequence contains no matching element错误
Acumatica 21.203.0030版本REST API上传附件失效排查思路
报错信息(已翻译):
系统应用异常:文件上传 - {"message":"发生错误","exceptionMessage":"序列中不存在匹配元素","exceptionType":"System.InvalidOperationException","stackTrace":" 于 System.Linq.Enumerable.Single[TSource](IEnumerable1 source, Func2 predicate)\r\n 于 PX.Api.ContractBased.SystemContracts.V2.SoapFacade.PX.Api.ContractBased.IRestGate.PutFile(EntityImpl entityImpl, String filename, HttpContent body)\r\n 于 PX.Api.ContractBased.SystemContracts.V2.RestController.PutFile(String objectName, String ids)\r\n ...后续堆栈省略"}
该问题的核心表现是文件已写入UploadFile表但未生成NoteDoc关联记录,本质是API执行时无法匹配到对应的目标实体记录,导致Linq的Single方法抛出无匹配元素异常,可按以下顺序排查:
- 检查自定义DAC的NoteID配置
21.2版本加强了附件关联的字段校验,需确认自定义实体DAC的NoteID字段添加了[PXNote(ShowInReferenceSelector = true)]特性,且字段未被标记为禁用、隐藏。如果是升级前创建的DAC,可能旧特性参数不符合新版本要求,补全参数后重新发布自定义即可。 - 确认Web服务端点已暴露NoteID字段
即使业务上不需要返回NoteID值,21.2之后的REST API上传附件要求对应实体必须在端点配置中显式添加NoteID字段。重新检查你创建的端点,找到对应自定义实体的字段列表,新增NoteID字段并保存发布端点后重试。 - 校验API请求的实体ID参数格式
新版本对复合主键的编码格式校验更严格,如果自定义屏幕的实体是多主键,确认请求URL中的ids参数的字段分隔符、转义规则符合要求,没有出现特殊字符未转义、字段顺序错误、大小写不匹配的情况,避免系统无法通过传入的ID匹配到对应实体。 - 开启Debug日志排查实体匹配逻辑
到【系统管理-系统监控-日志】中将API相关的日志级别调整为Debug,重现上传操作,查看日志中记录的实体查询条件、传入参数值,确认是否存在字段类型转换异常(比如日期格式、数值精度不匹配)导致查询不到对应记录。 - 检查自定义图形的主视图配置
确认自定义页面的Graph主视图对应的DAC和端点中实体绑定的DAC一致,主视图未添加额外的过滤条件导致API查询时无法匹配到已存在的记录。21.2版本API查询实体的逻辑改为优先走Graph的主视图,主视图有过滤的话会导致匹配失败。 - 验证官方原生屏幕的上传功能
调用原生实体(比如InventoryItem)的REST API上传附件测试,如果原生功能也报错,说明是版本本身的缺陷,21.203.0030版本存在已知的REST API附件上传Bug,安装对应修复补丁即可解决;如果原生功能正常,即可锁定问题在自定义屏幕的配置上。
内容的提问来源于stack exchange,提问作者Joseph Caruana
相关产品推荐
相关产品推荐

