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
相关产品推荐
相关产品推荐

