You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 09:13:24