使用Hl7.Fhir.STU3的FhirClient未正确设置AdverseEvent的versionId
问题分析
你遇到的核心问题是混淆了FHIR规范中VersionId的用途,以及服务器对PSIMS Taxonomy版本的要求:
- FHIR资源的
VersionId属性(对应JSON中的_versionId)是服务器用来管理资源版本的标识,客户端创建资源时不需要手动设置,服务器会自动生成。 - 你尝试设置的
5.0.0是PSIMS Taxonomy的业务版本,而非FHIR资源的服务器版本,错误地放到VersionId属性后,序列化时出现异常,导致服务器接收不到正确版本号,返回Version '0'的错误。
解决方案
1. 移除错误的VersionId设置
首先删除代码中对AdverseEvent.VersionId的赋值,该属性由服务器维护,创建资源时无需指定:
var adverseEvent = new AdverseEvent() { Meta = new Meta() { Profile = new string[] { "https://psims-uat.azure-api.net/taxonomy/fhir/StructureDefinition/patient-safety-adverse-event-5" } } // 移除VersionId = "5.0.0"这一行 };
2. 正确传递PSIMS Taxonomy版本
根据你Postman测试的结果,服务器期望版本号出现在资源根节点,而FHIR规范中根节点没有自定义versionId的位置,需按以下方式处理:
- 如果服务器要求根节点的
versionId是自定义字段,通过FHIR扩展实现:// 添加自定义扩展,对应根节点的versionId字段 adverseEvent.AddExtension("https://psims-uat.azure-api.net/taxonomy/extension/version-id", new FhirString("5.0.0")); - 若服务器实际期望版本号包含在Meta信息中,设置
Meta.VersionId:Meta = new Meta() { Profile = new string[] { "https://psims-uat.azure-api.net/taxonomy/fhir/StructureDefinition/patient-safety-adverse-event-5" }, VersionId = "5.0.0" // 将版本号放在Meta的VersionId中 }
3. 验证序列化结果
调整代码后,先序列化AdverseEvent为JSON,确认版本号出现在服务器要求的位置(根节点或Meta中),再发送请求:
var serializer = new FhirJsonSerializer(new SerializerSettings { Pretty = true }); string json = serializer.SerializeToString(adverseEvent); // 检查json格式是否与Postman中正确的格式一致
4. 规范FhirClient配置
确保FhirClient使用STU3对应的序列化配置,避免序列化异常:
var settings = new FhirClientSettings { PreferredFormat = ResourceFormat.Json, UseFormatParam = true }; var fhirClient = new FhirClient(uri, settings, _handler); return await fhirClient.CreateAsync<AdverseEvent>(adverseEvent);
内容的提问来源于stack exchange,提问作者Mark Cooper
相关产品推荐
相关产品推荐

