使用fo-dicom从PACS保存DICOM时SaveImage方法未触发如何解决
FoDicom QueryRetrieve SCU无法触发SaveImage方法排查方案
你使用的核心代码如下:
var client = DicomClientFactory.Create(_qrServerHost, _qrServerPort, false, _aet, _qrServerAET); client.NegotiateAsyncOps(); // 查研究列表 var request = CreateStudyRequestByPatientName("Cooper"); var studyUids = new List<string>(); request.OnResponseReceived += (req, response) => { studyUids.Add(response.Dataset?.GetSingleValue<string>(DicomTag.StudyInstanceUID)); }; await client.AddRequestAsync(request); await client.SendAsync(); // 查对应研究下的序列 var studyUID = studyUids[0]; request = CreateSeriesRequestByStudyUID(studyUID); var serieUids = new List<string>(); request.OnResponseReceived += (req, response) => { serieUids.Add(response.Dataset?.GetSingleValue<string>(DicomTag.SeriesInstanceUID)); }; await client.AddRequestAsync(request); await client.SendAsync(); // 用C-GET拉取序列下的所有影像 client = DicomClientFactory.Create(_qrServerHost, _qrServerPort, false, _aet, _qrServerAET); var cGetRequest = CreateCGetBySeriesUID(studyUID, serieUids.First()); client.OnCStoreRequest += (DicomCStoreRequest req) => { Console.WriteLine(DateTime.Now.ToString() + " recived"); SaveImage(req.Dataset); return Task.FromResult(new DicomCStoreResponse(req, DicomStatus.Success)); }; var pcs = DicomPresentationContext.GetScpRolePresentationContextsFromStorageUids( DicomStorageCategory.Image, DicomTransferSyntax.ExplicitVRLittleEndian, DicomTransferSyntax.ImplicitVRLittleEndian, DicomTransferSyntax.ImplicitVRBigEndian); client.AdditionalPresentationContexts.AddRange(pcs); await client.AddRequestAsync(cGetRequest); await client.SendAsync();
可按以下优先级排查问题:
- 确认本地调用端AET(应用实体标识)已在目标DICOM服务器白名单中注册。公共测试DICOM服务器默认会拒绝未注册AET发起的C-GET请求,不会推送任何影像数据,因此不会触发OnCStoreRequest回调,自然无法进入SaveImage方法。
- 检查Presentation Context配置是否匹配目标影像的SOP类。你当前仅添加了图像类存储上下文,如果查询到的序列包含非图像类型的SOP实例(如结构化报告、波形文件),服务器无法匹配传输上下文就不会推送对应实例。可在之前的C-FIND序列查询阶段增加SOP类UID的返回字段,将该序列下所有用到的SOP类UID都添加到Presentation Context列表中。
- 确认C-GET请求的级别配置正确。
CreateCGetBySeriesUID方法需要将查询级别正确设置为SERIES级别,同时传入的StudyInstanceUID、SeriesInstanceUID两个必填标签不存在空值、格式错误的问题。 - 你当前发起C-GET请求的DicomClient没有调用
NegotiateAsyncOps()方法,如果服务器要求异步操作协商,也会导致请求失败,建议在创建C-GET用的DicomClient后也添加该行配置。 - 增加异常捕获和日志输出,在
client.SendAsync()外层添加try-catch捕获DicomException,查看返回的错误状态码,可快速定位是权限问题、请求参数错误还是传输上下文不匹配的问题。
内容的提问来源于stack exchange,提问作者Mike Murphy
相关产品推荐
相关产品推荐

