FhirClient.CreateAsync返回null而非OperationOutcome问题排查
FHIR Client创建资源返回null,无法获取OperationOutcome及资源ID的问题排查
问题重现
已配置FhirClient创建AdverseEvent资源,代码如下:
var clientSettings = FhirClientSettings.CreateDefault(); clientSettings.PreferredReturn = Prefer.OperationOutcome; var uri = $"https://psims-uat.azure-api.net/adverse-event/fhir"; var fhirClient = new FhirClient(uri, clientSettings, _handler); return await fhirClient.CreateAsync<AdverseEvent>(adverseEvent);
当前代码返回null,但需要获取OperationOutcome提取警告信息,同时拿到已创建资源的ID。补充:_handler是用于添加订阅密钥的自定义HttpClientHandler,代码如下:
public class SubscriptionKeyHeaderHandler : HttpClientHandler { private readonly string subKey; private readonly string fhirVersion; public SubscriptionKeyHeaderHandler(string subKey, string fhirVersion ) : base() { this.subKey = subKey; this.fhirVersion = fhirVersion; } protected async override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { request.Headers.Add("Ocp-Apim-Subscription-Key", subKey); request.Headers.Add("Cache-Control", "no-cache"); request.Headers.Add("fhir-version", fhirVersion); return await base.SendAsync(request, cancellationToken); } }
问题原因
当设置clientSettings.PreferredReturn = Prefer.OperationOutcome时,Hl7.Fhir的FhirClient.CreateAsync<T>方法设计上不会返回创建的资源实例(因此返回null),但服务器返回的OperationOutcome和资源位置信息会被存储在FhirClient.LastResult属性中,而非直接作为返回值返回。
解决方案
修改代码,调用CreateAsync后通过fhirClient.LastResult获取所需信息:
var clientSettings = FhirClientSettings.CreateDefault(); clientSettings.PreferredReturn = Prefer.OperationOutcome; var uri = $"https://psims-uat.azure-api.net/adverse-event/fhir"; var fhirClient = new FhirClient(uri, clientSettings, _handler); // 调用CreateAsync,此时返回值为null,无需接收 await fhirClient.CreateAsync<AdverseEvent>(adverseEvent); // 提取OperationOutcome OperationOutcome operationOutcome = fhirClient.LastResult.OperationOutcome; // 从Location头解析资源ID(Location格式通常为"{baseUrl}/AdverseEvent/{resourceId}") string resourceId = null; var locationHeader = fhirClient.LastResult.Location; if (!string.IsNullOrWhiteSpace(locationHeader)) { // 拆分路径获取ID,可根据实际返回格式调整逻辑 var pathSegments = locationHeader.Split('/'); resourceId = pathSegments.LastOrDefault(); } // 提取警告信息(遍历OperationOutcome的Issue集合) var warnings = operationOutcome?.Issue?.Where(i => i.Severity == IssueSeverity.Warning) .Select(i => i.Details?.Text) .ToList(); // 返回需要的信息,比如封装成自定义对象 return new { ResourceId = resourceId, OperationOutcome = operationOutcome, Warnings = warnings };
额外检查点
- 确认FHIR服务器支持
Prefer: operation-outcome请求头,部分服务器可能需要配置才能返回包含资源ID的OperationOutcome - 验证
SubscriptionKeyHeaderHandler添加的请求头是否符合服务器要求,确保请求能被正常处理 - 若
LastResult.Location为空,可检查OperationOutcome的Issue中是否包含资源ID的相关描述
内容的提问来源于stack exchange,提问作者Mark Cooper
相关产品推荐
相关产品推荐

