個人理解 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); } }