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

fo-dicom发送C-STORE请求遭PROPACS忽略,dcmtk可成功上传同文件

使用fo-dicom发送C-STORE至PROPACS无响应问题排查

问题现象

  • 使用fo-dicom执行C-STORE请求发送DCM文件至PROPACS时,PACS无业务响应;Wireshark抓包显示所有DCM数据包已发送、PACS已确认,但随后PACS发送FIN包终止连接
  • 同一DCM文件使用dcmtk的storescu.exe可成功完成传输

用户示例代码

var client = DicomClientFactory.Create("xxx.xxx.xxx.xxx", 104, false, "DemoScu", "PROPACS");
var cSto = new DicomCStoreRequest(@"2.dcm");
client.AddRequestAsync(cSto);
cSto.OnResponseReceived += (req, response) =>
    Console.WriteLine("C-Store Response Received, Status: " + response.Status); 
client.SendAsync();

排查与解决方案

由于storescu.exe能成功传输,说明问题出在fo-dicom与dcmtk的配置/交互逻辑差异上,可按以下步骤排查:

1. 对齐AE Title配置

PROPACS通常对AE Title的匹配要求严格(包括大小写、空格),检查fo-dicom中使用的调用方AE Title(DemoScu)是否与storescu.exe使用的一致:

  • 若storescu使用默认AE Title(如STORESCP),修改fo-dicom代码中的对应参数测试:
    var client = DicomClientFactory.Create("xxx.xxx.xxx.xxx", 104, false, "STORESCP", "PROPACS");
    

2. 强制匹配传输语法

fo-dicom可能默认使用与dcmtk不同的传输语法,导致PROPACS无法解析。手动指定与storescu一致的传输语法:

var cSto = new DicomCStoreRequest(@"2.dcm")
{
    TransferSyntax = DicomTransferSyntax.ImplicitVRLittleEndian // 或根据dcmtk实际使用值调整
};

3. 调整网络参数对齐dcmtk默认值

dcmtk与fo-dicom的默认PDU长度、超时等参数可能不同,手动配置一致:

client.Timeout = 30000; // 设置30秒超时,与dcmtk默认一致
client.Options = new DicomServiceOptions
{
    MaxPDULength = 16384, // dcmtk默认PDU长度为16384
    LogDataPDUs = true,
    LogDimseDatasets = true // 开启日志便于对比交互流程
};

4. 验证SOP Class上下文协商

确保fo-dicom协商的SOP Class UID与storescu一致,可手动添加对应上下文:

// 添加目标DCM文件对应的SOP Class,例如CT图像:
client.AddRequestAsync(cSto);
client.NegotiateAsyncOps();

5. 对比日志定位差异

开启fo-dicom的Debug级日志,与storescu.exe的日志(通过storescu -v启用)对比,找出交互流程中的差异点:

// 初始化前配置日志
DicomSetupBuilder.Create()
    .AddConsoleLogLevel(LogLevel.Debug)
    .Build();

内容的提问来源于stack exchange,提问作者Xiang He

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 06:50:09