个人理解 Dicom C-get 就是在没有设置任何验证情况下请求QR服务,而C-move是有验证的情况下请求QR服务。一般都是C-move,因为机器都需要验证。
Dicom C-move 原理:自己写一个SCU程序,通过scu发送请求给QR服务,再用自己的SCP来接收QR的C-Store回传的影像。
需要引用Dicom.Core 4.0.8.0或以下
/// <summary> /// C-Store SCP AE Title:影像归档目的地的 AE Title,之所以这样写,是因为 C-Move 既可以是两方通信,也可以是三方通信,如果是两方通信,那么 C-Move SCU 同时需要提供 C-Store SCP 的功 /// 能,这里就可以写 C-Move SCU 的 AE Title;如果是三方通信,那么这个影像归档的目的地之需要提供 C-Store SCP 的功能,所以这里的参数就要写C-Store SCP 的 AE Title; /// StudyInstanceUID:检查唯一标识; /// C-Move SCP IP:C-Move 服务端的 IP 地址或机器名; /// C-Move SCP Port:C-Move 服务端的端口; /// C-Move SCU AE Title:C-Move 客户端应用实体的名称; /// C-Move SCP AE Title:C-Move 服务端应用实体的名称; /// </summary> [Obsolete] private void C_Move(string studyInstanceUID) { try { SQLDBHelper helper = new SQLDBHelper(); var model = helper.GetByStudyID(studyInstanceUID); if (model != null && model.ID > 0) return; var successNum = new List<int>(); var client = new DicomClient(); //var request = new DicomCMoveRequest({ C - Store SCP AE Title }, { StudyInstanceUID}); var destinationAe = ConfigurationManager.AppSettings["DestinationAe"]; string host = ConfigurationManager.AppSettings["DicomHost"]; int port = int.Parse(ConfigurationManager.AppSettings["DicomPort"]); bool useTls = bool.Parse(ConfigurationManager.AppSettings["DicomUseTls"]); string callingAe = ConfigurationManager.AppSettings["DicomcallingAe"]; string calledAe = ConfigurationManager.AppSettings["DicomcalledAe"]; var request = new DicomCMoveRequest(destinationAe, studyInstanceUID); client.AddRequest(request); request.OnResponseReceived += (DicomCMoveRequest requ, DicomCMoveResponse response) => { if (response.Status.State == DicomState.Pending) { successNum.Add(response.Remaining); //Console.WriteLine("Sending is in progress. please wait: " + response.Remaining + " SOP instances need to do C-Store options"); } else if (response.Status.State == DicomState.Success) { if (successNum != null && successNum.Count > 0) { var maxNum = successNum.Max(); helper.Insert(studyInstanceUID, maxNum + 1); } //Console.WriteLine("Sending successfully finished"); } else if (response.Status.State == DicomState.Failure) { //Console.WriteLine("Error sending datasets: " + response.Status.Description); } //Console.WriteLine(response.Status); }; //client.Send({ C - Move SCP IP}, { C - Move SCP Port}, false, { C - Move SCU AE Title}, { C - Move SCP AE Title}); client.Send(host, port, useTls, callingAe, calledAe); } catch (Exception ex) { Logger.Instance().Error("用C-MOVE获取图像失败:" + ex.Message + " ,具体错误如下" + ex); } }