Microsoft D365 OData复合键实体URL无效问题求助
尝试操作BillOfMaterialsVersionsV4实体的特定记录(检索或删除),这个实体的复合键包含13个字段,其中ValidFromDate是DateTimeOffset类型。用类似下面的URL格式时一直报"Invalid URL"错误:
(dataAreaId='nava',ManufacturedItemNumber='26849',BOMId='26849_V1',ProductionSiteId='Nava',ProductConfigurationId='',ProductColorId='',ProductSizeId='',ProductStyleId='',ProductVersionId='',IsActive='Yes',ValidFromDate=1900-01-01T12:00:00Z,FromQuantity=1,SequenceId=1)
各种日期格式都试过了——NULL、空值、带引号/不带引号、V3的datetimeoffset'...'写法,全没用;用$filter按日期和其他字段过滤倒是正常,但没法用$filter删记录,现在急需解决这个问题来清理测试数据集。
试试下面这些方案:
严格按OData V4规范写DateTimeOffset键值
OData V4里,DateTimeOffset类型的键值必须用datetimeoffset前缀加单引号包裹,正确格式应该是:ValidFromDate=datetimeoffset'1900-01-01T12:00:00Z'完整的复合键URL长这样:
BillOfMaterialsVersionsV4(dataAreaId='nava',ManufacturedItemNumber='26849',BOMId='26849_V1',ProductionSiteId='Nava',ProductConfigurationId='',ProductColorId='',ProductSizeId='',ProductStyleId='',ProductVersionId='',IsActive='Yes',ValidFromDate=datetimeoffset'1900-01-01T12:00:00Z',FromQuantity=1,SequenceId=1)换空字符串的写法试试
有些OData服务对空字符串键值的解析有问题,如果ProductConfigurationId这些字段允许为null,把空字符串换成null(别加引号):ProductConfigurationId=null,ProductColorId=null,...检查URL编码
日期里的冒号这类特殊字符需要编码,编码后的日期部分是:ValidFromDate=datetimeoffset%271900-01-01T12%3A00%3A00Z%27有些工具会自动编码,但手动写URL的时候得注意这一点。
确认服务端的OData版本兼容
部分服务可能对V4语法支持不全,再试试V3的写法(虽然你试过,但再确认下服务端是不是要求这个):ValidFromDate=datetime'1900-01-01T12:00:00Z'
如果以上方法都不行,去查OData元数据文档确认ValidFromDate的精确类型(是不是DateTimeOffset而非DateTime),或者找服务端开发确认复合键的解析规则。
内容的提问来源于stack exchange,提问作者Jake Smith

