private void CStoreTask(object state) { Interlocked.Increment(ref index); string file = (string)state; DicomCStoreRequest cstoreReq = new DicomCStoreRequest(file); DicomClient client = new DicomClient(); client.AddRequest(cstoreReq); client.Send("127.0.0.1", 104, false, string.Format("ZSSURE_{0}",index), "STORESCP"); }
public void OldDicomClientSend_ToRejectedAssociation_ShouldNotSendRequest() { var port = Ports.GetNext(); using (DicomServer.Create <DicomClientTest.MockCEchoProvider>(port)) { var locker = new object(); DicomStatus status = null; var client = new Dicom.Network.DicomClient(); client.AddRequest( new DicomCEchoRequest { OnResponseReceived = (rq, rsp) => { lock (locker) status = rsp.Status; } }); try { client.Send("localhost", port, false, "SCU", "WRONG-SCP"); } catch { } Assert.Null(status); } }
public void Create_SubclassedServer_SufficientlyCreated() { var port = Ports.GetNext(); using (var server = DicomServer.Create <DicomCEchoProvider, DicomCEchoProviderServer>(null, port)) { Assert.IsType <DicomCEchoProviderServer>(server); Assert.Equal(DicomServer.GetInstance(port), server); var status = DicomStatus.UnrecognizedOperation; var handle = new ManualResetEventSlim(); var client = new DicomClient(); client.AddRequest(new DicomCEchoRequest { OnResponseReceived = (req, rsp) => { status = rsp.Status; handle.Set(); } }); client.Send("127.0.0.1", port, false, "SCU", "ANY-SCP"); handle.Wait(1000); Assert.Equal(DicomStatus.Success, status); } }
public void DicomCGetRequest_OneImageInSeries_Received() { var client = new DicomClient(); client.Options = new DicomServiceOptions { IgnoreAsyncOps = true }; var pcs = DicomPresentationContext.GetScpRolePresentationContextsFromStorageUids( DicomStorageCategory.Image, DicomTransferSyntax.ExplicitVRLittleEndian, DicomTransferSyntax.ImplicitVRLittleEndian, DicomTransferSyntax.ImplicitVRBigEndian); client.AdditionalPresentationContexts.AddRange(pcs); DicomDataset dataset = null; client.OnCStoreRequest = request => { dataset = request.Dataset; return new DicomCStoreResponse(request, DicomStatus.Success); }; var get = new DicomCGetRequest( "1.2.840.113619.2.1.1.322987881.621.736170080.681", "1.2.840.113619.2.1.2411.1031152382.365.736169244"); var handle = new ManualResetEventSlim(); get.OnResponseReceived = (request, response) => { handle.Set(); }; client.AddRequest(get); client.Send("localhost", 11112, false, "SCU", "COMMON"); handle.Wait(); Assert.Equal("RT ANKLE", dataset.Get<string>(DicomTag.StudyDescription)); }
public void Send_PrivateRegisteredSOPClass_SendSucceeds() { var uid = new DicomUID("1.1.1.1", "Private Fo-Dicom Storage", DicomUidType.SOPClass); DicomUID.Register(uid); var ds = new DicomDataset( new DicomUniqueIdentifier(DicomTag.SOPClassUID, uid), new DicomUniqueIdentifier(DicomTag.SOPInstanceUID, "1.2.3.4.5")); var port = Ports.GetNext(); using (DicomServer.Create <SimpleCStoreProvider>(port)) { DicomStatus status = null; var request = new DicomCStoreRequest(new DicomFile(ds)) { OnResponseReceived = (req, res) => status = res.Status }; var client = new DicomClient(); client.AddRequest(request); client.Send("127.0.0.1", port, false, "SCU", "ANY-SCP"); Assert.Equal(DicomStatus.Success, status); } }
public void Send_SingleRequest_DataSufficientlyTransported() { int port = Ports.GetNext(); using (new DicomServer<SimpleCStoreProvider>(port)) { DicomDataset command = null, dataset = null; var request = new DicomCStoreRequest(@".\Test Data\CT1_J2KI"); request.OnResponseReceived = (req, res) => { command = request.Command; dataset = request.Dataset; }; var client = new DicomClient(); client.AddRequest(request); client.Send("127.0.0.1", port, false, "SCU", "ANY-SCP"); var commandField = command.Get<ushort>(DicomTag.CommandField); Assert.Equal((ushort)1, commandField); var modality = dataset.Get<string>(DicomTag.Modality); Assert.Equal("CT", modality); } }
static void Main(string[] args) { //构造要发送的C-FIND-RQ消息,如果查看DicomCFindRequest类的话 //可以看到其定义与DICOM3.0标准第7部分第9章中规定的编码格式一致 //在构造Study级别的查询时,我们的参数patientID会被填充到消息的Indentifier部分,用来在SCP方进行匹配查询 var cfind = DicomCFindRequest.CreateStudyQuery(patientId: "12345"); //当接收到对方发挥的响应消息时,进行相应的操作【注】:该操作在DICOM3.0协议 //第7部分第8章中有说明,DIMSE协议并未对其做出规定,而应该有用户自己设定 cfind.OnResponseReceived = (rq, rsp) => { //此处我们只是简单的将查询到的结果输出到屏幕 Console.WriteLine("PatientAge:{0} PatientName:{1}", rsp.Dataset.Get<string>(DicomTag.PatientAge), rsp.Dataset.Get<string>(DicomTag.PatientName)); }; //发起C-FIND-RQ: //该部分就是利用A-ASSOCIATE服务来建立DICOM实体双方之间的连接。 var client = new DicomClient(); client.AddRequest(cfind); client.Send(host:"127.0.0.1",port: 12345,useTls: false,callingAe: "SCU-AE",calledAe: "SCP-AE"); Console.ReadLine(); }
public void Send_EchoRequestToExternalServer_ShouldSucceed() { var result = false; var awaiter = new ManualResetEventSlim(); var client = new DicomClient(); var req = new DicomCEchoRequest(); req.OnResponseReceived = (rq, rsp) => { if (rsp.Status == DicomStatus.Success) { result = true; } awaiter.Set(); }; client.AddRequest(req); try { client.Send("localhost", 11112, false, "SCU", "COMMON"); awaiter.Wait(); } catch (Exception ex) { result = false; client.Logger.Error("Send failed, exception: {0}", ex); awaiter.Set(); } Assert.True(result); }
public void Send_Plus128CStoreRequestsCompressedTransferSyntax_NoOverflowContextIdsAllRequestsRecognized(int expected) { var port = Ports.GetNext(); using (DicomServer.Create <SimpleCStoreProvider>(port)) { var actual = 0; var client = new DicomClient(); client.NegotiateAsyncOps(expected, 1); for (var i = 0; i < expected; ++i) { client.AddRequest(new DicomCStoreRequest(@"./Test Data/CT1_J2KI") { OnResponseReceived = (req, res) => Interlocked.Increment(ref actual) }); } var exception = Record.Exception(() => client.Send("127.0.0.1", port, false, "SCU", "ANY-SCP")); Assert.Null(exception); Assert.Equal(expected, actual); } }
public void Send_MultipleRequests_AllRecognized(int expected) { var port = Ports.GetNext(); var flag = new ManualResetEventSlim(); using (DicomServer.Create <DicomCEchoProvider>(port)) { var actual = 0; DicomCEchoRequest.ResponseDelegate callback = (req, res) => { Interlocked.Increment(ref actual); if (actual == expected) { flag.Set(); } }; var client = new DicomClient(); client.NegotiateAsyncOps(expected, 1); for (var i = 0; i < expected; ++i) { client.AddRequest(new DicomCEchoRequest { OnResponseReceived = callback }); } client.Send("127.0.0.1", port, false, "SCU", "ANY-SCP"); flag.Wait(10000); Assert.Equal(expected, actual); } }
public void Old_Send_SingleRequest_DataSufficientlyTransported() { int port = Ports.GetNext(); using (DicomServer.Create <SimpleCStoreProvider>(port)) { DicomDataset command = null, dataset = null; var request = new DicomCStoreRequest(@".\Test Data\CT1_J2KI"); request.OnResponseReceived = (req, res) => { command = request.Command; dataset = request.Dataset; }; var client = new DicomClient(); client.AddRequest(request); client.Send("127.0.0.1", port, false, "SCU", "ANY-SCP"); var commandField = command.Get <ushort>(DicomTag.CommandField); Assert.Equal((ushort)1, commandField); var modality = dataset.Get <string>(DicomTag.Modality); Assert.Equal("CT", modality); } }
public void OldDicomClientSend_ToAcceptedAssociation_ShouldSendRequest() { var port = Ports.GetNext(); using (DicomServer.Create <DicomClientTest.MockCEchoProvider>(port)) { var locker = new object(); var expected = DicomStatus.Success; DicomStatus actual = null; var client = new Dicom.Network.DicomClient(); client.AddRequest( new DicomCEchoRequest { OnResponseReceived = (rq, rsp) => { lock (locker) actual = rsp.Status; } }); client.Send("localhost", port, false, "SCU", "ANY-SCP"); Assert.Equal(expected, actual); } }
public void Old_Send_PrivateTags_DataSufficientlyTransported() { var port = Ports.GetNext(); using (DicomServer.Create <SimpleCStoreProvider>(port)) { DicomDataset command = null, requestDataset = null, responseDataset = null; var request = new DicomCStoreRequest(new DicomDataset { { DicomTag.CommandField, (ushort)DicomCommandField.CStoreRequest }, { DicomTag.AffectedSOPClassUID, DicomUID.CTImageStorage }, { DicomTag.MessageID, (ushort)1 }, { DicomTag.AffectedSOPInstanceUID, "1.2.3" }, }); var privateCreator = DicomDictionary.Default.GetPrivateCreator("Testing"); var privTag1 = new DicomTag(4013, 0x008, privateCreator); var privTag2 = new DicomTag(4013, 0x009, privateCreator); DicomDictionary.Default.Add(new DicomDictionaryEntry(privTag1, "testTag1", "testKey1", DicomVM.VM_1, false, DicomVR.CS)); DicomDictionary.Default.Add(new DicomDictionaryEntry(privTag2, "testTag2", "testKey2", DicomVM.VM_1, false, DicomVR.CS)); request.Dataset = new DicomDataset(); request.Dataset.Add(DicomTag.Modality, "CT"); request.Dataset.Add(privTag1, "TESTA"); request.Dataset.Add(new DicomCodeString(privTag2, "TESTB")); //{ // { DicomTag.Modality, "CT" }, // new DicomCodeString(privTag1, "test1"), // { privTag2, "test2" }, //}; request.OnResponseReceived = (req, res) => { command = req.Command; requestDataset = req.Dataset; responseDataset = res.Dataset; }; var client = new DicomClient(); client.AddRequest(request); client.Send("127.0.0.1", port, false, "SCU", "ANY-SCP"); Assert.Equal((ushort)1, command.Get <ushort>(DicomTag.CommandField)); Assert.Equal("CT", requestDataset.Get <string>(DicomTag.Modality)); Assert.Equal("TESTB", requestDataset.Get <string>(privTag2, null)); Assert.Equal("TESTA", requestDataset.Get <string>(privTag1, null)); Assert.Equal("CT", responseDataset.Get <string>(DicomTag.Modality)); // Assert.Equal("test1", responseDataset.Get<DicomCodeString>(privTag1).Get<string>()); Assert.Equal("TESTB", responseDataset.Get <string>(privTag2, -1, null)); Assert.Equal("TESTA", responseDataset.Get <string>(privTag1, null)); } }
public void Send_RejectedAssociation_ShouldYieldException() { var port = Ports.GetNext(); using (DicomServer.Create <MockCEchoProvider>(port)) { var client = new DicomClient(); client.AddRequest(new DicomCEchoRequest()); var exception = Record.Exception(() => client.Send("127.0.0.1", port, false, "SCU", "INVALID")); Assert.IsType <DicomAssociationRejectedException>(exception); } }
static void ThreadProcess(object state) { string clientID = state.ToString(); DicomCFindRequest cfindReq = DicomCFindRequest.CreatePatientQuery("1111", "test"); cfindReq.OnResponseReceived += (req, rsp) => { System.Console.WriteLine(rsp.ToString()+"ClientID="+clientID); }; DicomClient client = new DicomClient(); client.AddRequest(cfindReq); client.Send("127.0.0.1", 104, false, "FINDSCU", "FINDSCP"); }
public void Send_MultipleRequests_AllRecognized(int expected) { int port = Ports.GetNext(); using (new DicomServer<DicomCEchoProvider>(port)) { var actual = 0; var client = new DicomClient(); for (var i = 0; i < expected; ++i) client.AddRequest(new DicomCEchoRequest { OnResponseReceived = (req, res) => ++actual }); client.Send("127.0.0.1", port, false, "SCU", "ANY-SCP"); Assert.Equal(expected, actual); } }
public void Send_RecordAssociationData_AssociationContainsHostAndPort() { int port = Ports.GetNext(); using (DicomServer.Create <MockCEchoProvider>(port)) { var client = new DicomClient(); client.AddRequest(new DicomCEchoRequest()); client.Send("127.0.0.1", port, false, "SCU", "ANY-SCP"); Assert.NotNull(remoteHost); Assert.True(remotePort > 0); Assert.NotEqual(port, remotePort); } }
public void IsSendRequired_NoRequestNotConnected_ReturnsFalse() { var port = Ports.GetNext(); using (DicomServer.Create <DicomCEchoProvider>(port)) { var client = new DicomClient(); client.AddRequest(new DicomCEchoRequest { OnResponseReceived = (req, res) => Thread.Sleep(100) }); client.Send("127.0.0.1", port, false, "SCU", "ANY-SCP"); Assert.False(client.IsSendRequired); } }
public void DicomClientSend_StorePart10File_ShouldSucceed() { var port = Ports.GetNext(); using (var server = DicomServer.Create<CStoreScp>(port)) { var file = DicomFile.Open(@".\Test Data\CT-MONO2-16-ankle"); var client = new DicomClient(); client.AddRequest(new DicomCStoreRequest(file)); var exception = Record.Exception(() => client.Send("127.0.0.1", port, false, "SCU", "SCP")); Assert.Null(exception); } }
public void Send_ToDicomServer_ReturnsSuccess() { Task.Run(() => new DicomServer<DicomCEchoProvider>(104)).Wait(100); var client = new DicomClient(); client.NegotiateAsyncOps(); DicomStatus status = null; var request = new DicomCEchoRequest { OnResponseReceived = (echoRequest, response) => status = response.Status }; client.AddRequest(request); client.Send("localhost", 104, false, "ECHOSCU", "ECHOSCP"); while (status == null) Thread.Sleep(10); Assert.AreEqual(DicomStatus.Success, status); }
public void Send_FromIpv6ToIpv4AnyListenerKnownSOPClass_SendFails() { var port = Ports.GetNext(); using (DicomServer.Create <SimpleCStoreProvider>(NetworkManager.IPv4Any, port)) { var request = new DicomCStoreRequest(@".\Test Data\CT-MONO2-16-ankle"); var client = new DicomClient(); client.AddRequest(request); var exception = Record.Exception(() => client.Send(NetworkManager.IPv6Loopback, port, false, "SCU", "ANY-SCP")); Assert.IsAssignableFrom <SocketException>(exception); } }
public void Send_ToExplicitOnlyProvider_NotAccepted() { var port = Ports.GetNext(); using (DicomServer.Create <ExplicitLECStoreProvider>(port)) { var request = new DicomCStoreRequest(@"./Test Data/CR-MONO1-10-chest"); var client = new DicomClient(); client.AddRequest(request); var exception = Record.Exception(() => client.Send("127.0.0.1", port, false, "SCU", "ANY-SCP")); Assert.IsType <DicomAssociationRejectedException>(exception); } }
public void Send_SingleRequest_Recognized() { int port = Ports.GetNext(); using (DicomServer.Create<DicomCEchoProvider>(port)) { var counter = 0; var request = new DicomCEchoRequest { OnResponseReceived = (req, res) => ++counter }; var client = new DicomClient(); client.AddRequest(request); client.Send("127.0.0.1", port, false, "SCU", "ANY-SCP"); Assert.Equal(1, counter); } }
public void AssociationAccepted_SuccessfulSend_IsInvoked() { var port = Ports.GetNext(); using (DicomServer.Create <MockCEchoProvider>(port)) { var client = new DicomClient(); var accepted = false; client.AssociationAccepted += (sender, args) => accepted = true; client.AddRequest(new DicomCEchoRequest()); client.Send("127.0.0.1", port, false, "SCU", "ANY-SCP"); Assert.True(accepted); } }
public void IsSendRequired_AddedRequestNotConnected_ReturnsTrue() { var port = Ports.GetNext(); using (DicomServer.Create <DicomCEchoProvider>(port)) { var client = new DicomClient(); client.AddRequest(new DicomCEchoRequest()); Assert.True(client.IsSendRequired); client.Send("127.0.0.1", port, false, "SCU", "ANY-SCP"); Thread.Sleep(100); client.AddRequest(new DicomCEchoRequest()); Assert.True(client.IsSendRequired); } }
public void Send_FromDicomClient_DoesNotDeadlock() { LogManager.SetImplementation(new StringLogManager()); int port = Ports.GetNext(); using (new DicomServer<DicomCEchoProvider>(port)) { var client = new DicomClient(); for (var i = 0; i < 10; i++) client.AddRequest(new DicomCEchoRequest()); client.Send("127.0.0.1", port, false, "SCU", "ANY-SCP"); var log = LogManager.GetLogger(null).ToString(); Assert.True(log.Length > 0); } }
public void AssociationRejected_AssociationNotAllowed_IsInvoked() { var port = Ports.GetNext(); using (DicomServer.Create <MockCEchoProvider>(port)) { var client = new DicomClient(); var reason = DicomRejectReason.NoReasonGiven; client.AssociationRejected += (sender, args) => reason = args.Reason; client.AddRequest(new DicomCEchoRequest()); var exception = Record.Exception(() => client.Send("127.0.0.1", port, false, "SCU", "NOTACCEPTEDSCP")); Assert.Equal(DicomRejectReason.CalledAENotRecognized, reason); Assert.NotNull(exception); } }
public void Send_Ipv6AnyListenerKnownSOPClass_SendSucceeds() { var port = Ports.GetNext(); using (DicomServer.Create <SimpleCStoreProvider>(NetworkManager.IPv6Any, port)) { DicomStatus status = null; var request = new DicomCStoreRequest(@".\Test Data\CT-MONO2-16-ankle"); request.OnResponseReceived = (req, res) => { status = res.Status; }; var client = new DicomClient(); client.AddRequest(request); client.Send(NetworkManager.IPv6Loopback, port, false, "SCU", "ANY-SCP"); Assert.Equal(DicomStatus.Success, status); } }
public void AssociationReleased_SuccessfulSend_IsInvoked() { var port = Ports.GetNext(); using (DicomServer.Create <DicomCEchoProvider>(port)) { var client = new DicomClient(); var released = false; var handle = new ManualResetEventSlim(); client.AssociationReleased += (sender, args) => { released = true; handle.Set(); }; client.AddRequest(new DicomCEchoRequest()); client.Send("127.0.0.1", port, false, "SCU", "ANY-SCP"); handle.Wait(1000); Assert.True(released); } }
public void Send_PrivateNotRegisteredSOPClass_SendFails() { var port = Ports.GetNext(); using (DicomServer.Create <SimpleCStoreProvider>(port)) { DicomStatus status = null; var request = new DicomCStoreRequest(@".\Test Data\GH355.dcm"); request.OnResponseReceived = (req, res) => { status = res.Status; }; var client = new DicomClient(); client.AddRequest(request); client.Send("127.0.0.1", port, false, "SCU", "ANY-SCP"); Assert.Equal(DicomStatus.SOPClassNotSupported, status); } }
public void Send_SingleRequest_Recognized() { int port = Ports.GetNext(); using (DicomServer.Create <DicomCEchoProvider>(port)) { var counter = 0; var request = new DicomCEchoRequest { OnResponseReceived = (req, res) => Interlocked.Increment(ref counter) }; var client = new DicomClient(); client.AddRequest(request); client.Send("127.0.0.1", port, false, "SCU", "ANY-SCP"); Assert.Equal(1, counter); } }
public void Send_FromDicomClient_DoesNotDeadlock() { LogManager.SetImplementation(new StringLogManager()); int port = Ports.GetNext(); using (new DicomServer <DicomCEchoProvider>(port)) { var client = new DicomClient(); for (var i = 0; i < 10; i++) { client.AddRequest(new DicomCEchoRequest()); } client.Send("127.0.0.1", port, false, "SCU", "ANY-SCP"); var log = LogManager.GetLogger(null).ToString(); Assert.True(log.Length > 0); } }
public void Send_KnownSOPClass_SendSucceeds() { var port = Ports.GetNext(); using (DicomServer.Create <SimpleCStoreProvider>(port)) { DicomStatus status = null; var request = new DicomCStoreRequest(@".\Test Data\CT-MONO2-16-ankle") { OnResponseReceived = (req, res) => status = res.Status }; var client = new DicomClient(); client.AddRequest(request); client.Send("127.0.0.1", port, false, "SCU", "ANY-SCP"); Assert.Equal(DicomStatus.Success, status); } }
public void Send_FromDicomClient_DoesNotDeadlock() { LogManager.SetImplementation(NLogManager.Instance); var target = NLogHelper.AssignMemoryTarget( nameof(DicomCEchoProviderTest), @"${message}", NLog.LogLevel.Trace); var port = Ports.GetNext(); using (DicomServer.Create<DicomCEchoProvider>(port)) { var client = new DicomClient(); for (var i = 0; i < 10; i++) { client.AddRequest(new DicomCEchoRequest()); } client.Send("127.0.0.1", port, false, "SCU", "ANY-SCP"); Assert.True(target.Logs.Count > 0); } }
public void Send_MultipleTimes_AllRecognized(int expected) { int port = Ports.GetNext(); var @lock = new object(); using (new DicomServer <DicomCEchoProvider>(port)) { var actual = 0; var client = new DicomClient(); for (var i = 0; i < expected; ++i) { client.AddRequest(new DicomCEchoRequest { OnResponseReceived = (req, res) => { lock (@lock) ++actual; } }); client.Send("127.0.0.1", port, false, "SCU", "ANY-SCP"); } Assert.Equal(expected, actual); } }
public void Send_ToDicomServer_ReturnsSuccess() { Task.Run(() => new DicomServer <DicomCEchoProvider>(104)).Wait(100); var client = new DicomClient(); client.NegotiateAsyncOps(); DicomStatus status = null; var request = new DicomCEchoRequest { OnResponseReceived = (echoRequest, response) => status = response.Status }; client.AddRequest(request); client.Send("localhost", 104, false, "ECHOSCU", "ECHOSCP"); while (status == null) { Thread.Sleep(10); } Assert.AreEqual(DicomStatus.Success, status); }
public void Send_FromDicomClient_DoesNotDeadlock() { LogManager.SetImplementation(NLogManager.Instance); var target = NLogHelper.AssignMemoryTarget( "Dicom.Network", @"${message}", NLog.LogLevel.Trace); var port = Ports.GetNext(); using (DicomServer.Create <DicomCEchoProvider>(port)) { var client = new DicomClient(); for (var i = 0; i < 10; i++) { client.AddRequest(new DicomCEchoRequest()); } client.Send("127.0.0.1", port, false, "SCU", "ANY-SCP"); Assert.True(target.Logs.Count > 0); } }
public void DicomCGetRequest_PickCTImagesInStudy_OnlyCTImagesRetrieved() { var client = new DicomClient(); var pc = DicomPresentationContext.GetScpRolePresentationContext(DicomUID.CTImageStorage); client.AdditionalPresentationContexts.Add(pc); var counter = 0; var locker = new object(); client.OnCStoreRequest = request => { lock (locker) { ++counter; } return(new DicomCStoreResponse(request, DicomStatus.Success)); }; var get = new DicomCGetRequest("1.2.840.113619.2.55.3.2609388324.145.1222836278.84"); var handle = new ManualResetEventSlim(); get.OnResponseReceived = (request, response) => { if (response.Remaining == 0) { handle.Set(); } }; client.AddRequest(get); client.Send("localhost", 11112, false, "SCU", "COMMON"); handle.Wait(); Assert.Equal(140, counter); }
public void Send_MultipleRequests_AllRecognized(int expected) { int port = Ports.GetNext(); using (DicomServer.Create <DicomCEchoProvider>(port)) { var actual = 0; var client = new DicomClient(); client.NegotiateAsyncOps(expected, 1); for (var i = 0; i < expected; ++i) { client.AddRequest(new DicomCEchoRequest { OnResponseReceived = (req, res) => Interlocked.Increment(ref actual) }); } client.Send("127.0.0.1", port, false, "SCU", "ANY-SCP"); Assert.Equal(expected, actual); } }
public void Send_PrivateRegisteredSOPClass_SendSucceeds() { var uid = new DicomUID("1.3.46.670589.11.0.0.12.1", "Private MR Spectrum Storage", DicomUidType.SOPClass); DicomUID.Register(uid); var port = Ports.GetNext(); using (DicomServer.Create <SimpleCStoreProvider>(port)) { DicomStatus status = null; var request = new DicomCStoreRequest(@".\Test Data\GH355.dcm"); request.OnResponseReceived = (req, res) => { status = res.Status; }; var client = new DicomClient(); client.AddRequest(request); client.Send("127.0.0.1", port, false, "SCU", "ANY-SCP"); Assert.Equal(DicomStatus.Success, status); } }
public void Send_MultipleTimes_AllRecognized(int expected) { var port = Ports.GetNext(); var flag = new ManualResetEventSlim(); using (var server = DicomServer.Create <DicomCEchoProvider>(port)) { while (!server.IsListening) { Thread.Sleep(50); } var actual = 0; var client = new DicomClient(); for (var i = 0; i < expected; ++i) { client.AddRequest( new DicomCEchoRequest { OnResponseReceived = (req, res) => { _testOutputHelper.WriteLine($"{i}"); Interlocked.Increment(ref actual); if (actual == expected) { flag.Set(); } } }); client.Send("127.0.0.1", port, false, "SCU", "ANY-SCP"); } flag.Wait(10000); Assert.Equal(expected, actual); } }
public void DicomCGetRequest_PickCTImagesInStudy_OnlyCTImagesRetrieved() { var client = new DicomClient(); client.Options = new DicomServiceOptions { IgnoreAsyncOps = true }; var pc = DicomPresentationContext.GetScpRolePresentationContext(DicomUID.CTImageStorage); client.AdditionalPresentationContexts.Add(pc); var counter = 0; var locker = new object(); client.OnCStoreRequest = request => { lock (locker) { ++counter; } return new DicomCStoreResponse(request, DicomStatus.Success); }; var get = new DicomCGetRequest("1.2.840.113619.2.55.3.2609388324.145.1222836278.84"); var handle = new ManualResetEventSlim(); get.OnResponseReceived = (request, response) => { if (response.Remaining == 0) { handle.Set(); } }; client.AddRequest(get); client.Send("localhost", 11112, false, "SCU", "COMMON"); handle.Wait(); Assert.Equal(140, counter); }
//[InlineData(100)] public void Send_MultipleTimes_AllRecognized(int expected) { int port = Ports.GetNext(); using (var server = DicomServer.Create<DicomCEchoProvider>(port)) { while (!server.IsListening) Thread.Sleep(50); var actual = 0; var client = new DicomClient(); for (var i = 0; i < expected; ++i) { client.AddRequest(new DicomCEchoRequest { OnResponseReceived = (req, res) => Interlocked.Increment(ref actual) }); client.Send("127.0.0.1", port, false, "SCU", "ANY-SCP"); } client.Release(); Assert.Equal(expected, actual); } }
public void Send_EchoRequestToExternalServer_ShouldSucceed() { var result = false; var awaiter = new ManualResetEventSlim(); var client = new DicomClient(); var req = new DicomCEchoRequest(); req.OnResponseReceived = (rq, rsp) => { if (rsp.Status == DicomStatus.Success) { result = true; } awaiter.Set(); }; client.AddRequest(req); try { client.Send("localhost", 11112, false, "SCU", "COMMON"); awaiter.Wait(); } catch (Exception ex) { result = false; Console.WriteLine(ex); awaiter.Set(); } Assert.True(result); }
public void Send_RejectedAssociation_ShouldYieldException() { var port = Ports.GetNext(); using (DicomServer.Create<MockCEchoProvider>(port)) { var client = new DicomClient(); client.AddRequest(new DicomCEchoRequest()); var exception = Record.Exception(() => client.Send("127.0.0.1", port, false, "SCU", "INVALID")); Assert.IsType<DicomAssociationRejectedException>(exception); } }
public void Send_RecordAssociationData_AssociationContainsHostAndPort() { int port = Ports.GetNext(); using (DicomServer.Create<MockCEchoProvider>(port)) { var client = new DicomClient(); client.AddRequest(new DicomCEchoRequest()); client.Send("127.0.0.1", port, false, "SCU", "ANY-SCP"); Assert.NotNull(remoteHost); Assert.True(remotePort > 0); Assert.NotEqual(port, remotePort); } }
private static void Main(string[] args) { try { // Initialize log manager. LogManager.SetImplementation(NLogManager.Instance); DicomException.OnException += delegate(object sender, DicomExceptionEventArgs ea) { ConsoleColor old = Console.ForegroundColor; Console.ForegroundColor = ConsoleColor.Yellow; Console.WriteLine(ea.Exception); Console.ForegroundColor = old; }; var config = new LoggingConfiguration(); var target = new ColoredConsoleTarget(); target.Layout = @"${date:format=HH\:mm\:ss} ${message}"; config.AddTarget("Console", target); config.LoggingRules.Add(new LoggingRule("*", NLog.LogLevel.Debug, target)); NLog.LogManager.Configuration = config; //var server = new DicomServer<DicomCEchoProvider>(12345); var client = new DicomClient(); //client.NegotiateAsyncOps(); //for (int i = 0; i < 10; i++) // client.AddRequest(new DicomCEchoRequest()); client.AddRequest(new DicomCStoreRequest(@"Z:\test1.dcm")); client.AddRequest(new DicomCStoreRequest(@"Z:\test2.dcm")); client.Send("127.0.0.1", 104, false, "SCU", "ANY-SCP"); foreach (DicomPresentationContext ctr in client.AdditionalPresentationContexts) { Console.WriteLine("PresentationContext: " + ctr.AbstractSyntax + " Result: " + ctr.Result); } var samplesDir = Path.Combine( Path.GetPathRoot(Environment.CurrentDirectory), "Development", "fo-dicom-samples"); var testDir = Path.Combine(samplesDir, "Test"); if (!Directory.Exists(testDir)) Directory.CreateDirectory(testDir); //var img = new DicomImage(samplesDir + @"\ClearCanvas\CRStudy\1.3.51.5145.5142.20010109.1105627.1.0.1.dcm"); //img.RenderImage().Save(testDir + @"\test.jpg"); //var df = DicomFile.Open(samplesDir + @"\User Submitted\overlays.dcm"); //Console.WriteLine(df.FileMetaInfo.Get<DicomTransferSyntax>(DicomTag.TransferSyntaxUID).UID.Name); //Console.WriteLine(df.Dataset.Get<PlanarConfiguration>(DicomTag.PlanarConfiguration)); //var img = new DicomImage(df.Dataset); //img.RenderImage().Save(testDir + @"\test.jpg"); //df = df.ChangeTransferSyntax(DicomTransferSyntax.JPEGLSLossless); //df.Save(testDir + @"\test-jls.dcm"); //df = df.ChangeTransferSyntax(DicomTransferSyntax.JPEG2000Lossless); //df.Save(testDir + @"\test-j2k.dcm"); //df = df.ChangeTransferSyntax(DicomTransferSyntax.JPEGProcess14SV1); //df.Save(testDir + @"\test-jll.dcm"); //df = df.ChangeTransferSyntax(DicomTransferSyntax.RLELossless); //df.Save(testDir + @"\test-rle.dcm"); //df = df.ChangeTransferSyntax(DicomTransferSyntax.ExplicitVRLittleEndian); //df.Save(testDir + @"\test-ele.dcm"); //df = df.ChangeTransferSyntax(DicomTransferSyntax.ExplicitVRBigEndian); //df.Save(testDir + @"\test-ebe.dcm"); //df = df.ChangeTransferSyntax(DicomTransferSyntax.ImplicitVRLittleEndian); //df.Save(testDir + @"\test-ile.dcm"); //Console.WriteLine("End..."); //Console.ReadLine(); //df.WriteToLog(LogManager.GetCurrentClassLogger(), LogLevel.Info); //Console.WriteLine(DicomValueMultiplicity.Parse("1")); //Console.WriteLine(DicomValueMultiplicity.Parse("3")); //Console.WriteLine(DicomValueMultiplicity.Parse("1-3")); //Console.WriteLine(DicomValueMultiplicity.Parse("1-n")); //Console.WriteLine(DicomValueMultiplicity.Parse("2-2n")); //Console.WriteLine(DicomTag.Parse("00200020")); //Console.WriteLine(DicomTag.Parse("0008,0040")); //Console.WriteLine(DicomTag.Parse("(3000,0012)")); //Console.WriteLine(DicomTag.Parse("2000,2000:TEST CREATOR")); //Console.WriteLine(DicomTag.Parse("(4000,4000:TEST_CREATOR:2)")); //Console.WriteLine(DicomMaskedTag.Parse("(30xx,xx90)")); //Console.WriteLine(DicomMaskedTag.Parse("(3000-3021,0016)")); //DicomRange<DateTime> r = new DicomRange<DateTime>(DateTime.Now.AddSeconds(-5), DateTime.Now.AddSeconds(5)); //Console.WriteLine(r.Contains(DateTime.Now)); //Console.WriteLine(r.Contains(DateTime.Today)); //Console.WriteLine(r.Contains(DateTime.Now.AddSeconds(60))); //DicomDictionary dict = new DicomDictionary(); //dict.Load(@"F:\Development\fo-dicom\DICOM\Dictionaries\dictionary.xml", DicomDictionaryFormat.XML); //string output = Dicom.Generators.DicomTagGenerator.Generate("Dicom", "DicomTag", dict); //File.WriteAllText(@"F:\Development\fo-dicom\DICOM\DicomTagGenerated.cs", output); //output = Dicom.Generators.DicomDictionaryGenerator.Generate("Dicom", "DicomDictionary", "LoadInternalDictionary", dict); //File.WriteAllText(@"F:\Development\fo-dicom\DICOM\DicomDictionaryGenerated.cs", output); //string output = Dicom.Generators.DicomUIDGenerator.Process(@"F:\Development\fo-dicom\DICOM\Dictionaries\dictionary.xml"); //File.WriteAllText(@"F:\Development\fo-dicom\DICOM\DicomUIDGenerated.cs", output); } catch (Exception e) { if (!(e is DicomException)) Console.WriteLine(e.ToString()); } }
public virtual IEnumerable<DicomCMoveResponse> OnCMoveRequest(DicomCMoveRequest request) { DicomStatus status = DicomStatus.Success; IList<DicomCMoveResponse> rsp = new List<DicomCMoveResponse>(); /*----to do------*/ //添加查询数据库的代码,即根据request的条件提取指定的图像 //然后将图像信息添加到rsp响应中 //创建C-STORE-SCU,发起C-STORE-RQ IList<DicomDataset> queries; DicomClient clt = new DicomClient(); if (OnZSCMoveRequest != null) { queries = OnZSCMoveRequest(request); if (queries != null) { Logger.Info("需要发送{0}个数据", queries.Count); int len = queries.Count; int cnt = 0; foreach (var item in queries) { //zssure: //取巧的方法直接利用request来构造response中相同的部分 //这部分与mDCM方式很不同 var studyUid = item.Get<string>(DicomTag.StudyInstanceUID); var instUid = item.Get<string>(DicomTag.SOPInstanceUID); //需要在c:\cmovetest目录下手动添加C-MOVE SCU请求的图像 //本地构造的目录结构为, // c:\cmovetest\12\0.dcm // c:\cmovetest\12\1.dcm // c:\cmovetest\12\2.dcm var path = Path.GetFullPath(@"c:\cmovetest"); try { path = Path.Combine(path, studyUid); if (!Directory.Exists(path)) Directory.CreateDirectory(path); path = Path.Combine(path, instUid) + ".dcm"; DicomCStoreRequest cstorerq = new DicomCStoreRequest(path); cstorerq.OnResponseReceived = (rq, rs) => { if (rs.Status != DicomStatus.Pending) { } if (rs.Status == DicomStatus.Success) { DicomCMoveResponse rsponse = new DicomCMoveResponse(request, DicomStatus.Pending); rsponse.Remaining = --len; rsponse.Completed = ++cnt; rsponse.Warnings = 0; rsponse.Failures = 0; //zssure:2014-12-24 //修复发送C-MOVE-RSP的逻辑错误 SendResponse(rsponse); //rsp.Add(rsponse); //zssure:end } }; clt.AddRequest(cstorerq); //注意:这里给出的IP地址与C-MOVE请求的IP地址相同,意思就是说C-MOVE SCP需要向C-MOVE SCU发送C-STORE-RQ请求 //将查询到的图像返回给C-MOVE SCU //所以四尺C-STORE-RQ中的IP地址与C-MOVE SCU相同,但是端口不同,因为同一个端口不能被绑定多次。 clt.Send("127.0.0.1", 22345, false, this.Association.CalledAE, request.DestinationAE); } catch (System.Exception ex) { DicomCMoveResponse rs = new DicomCMoveResponse(request, DicomStatus.StorageStorageOutOfResources); rsp.Add(rs); return rsp; } } //zssure: //发送完成后统一返回C-MOVE RESPONSE //貌似响应流程有问题,有待进一步核实 //注意,如果最后为发送DicomStatus.Success消息,TCP连接不会释放,浪费资源 rsp.Add(new DicomCMoveResponse(request, DicomStatus.Success)); return rsp; } else { rsp.Add(new DicomCMoveResponse(request, DicomStatus.NoSuchObjectInstance)); return rsp; } } rsp.Add(new DicomCMoveResponse(request, DicomStatus.NoSuchObjectInstance)); return rsp; }
static void Main(string[] args) { //开启C-STORE SCP服务,用于接收C-MOVE SCP返回的图像 CStoreSCP.OnCStoreRequestCallBack = (request) => { var studyUid = request.Dataset.Get<string>(DicomTag.StudyInstanceUID); var instUid = request.SOPInstanceUID.UID; var path = Path.GetFullPath(@"c:\cmove-scu"); path = Path.Combine(path, studyUid); if (!Directory.Exists(path)) Directory.CreateDirectory(path); path = Path.Combine(path, instUid) + ".dcm"; request.File.Save(path); return new DicomCStoreResponse(request, DicomStatus.Success); }; var cstoreServer = new DicomServer<CStoreSCP>(22345); //发起C-MOVE-RQ操作,发送请求的StudyID是12 DicomCMoveRequest req=new DicomCMoveRequest("DEST-AE","12"); var client=new DicomClient(); client.NegotiateAsyncOps(); client.AddRequest(req); //这里的IP地址是C-MOVE SCP的地址,12345端口号是C-MOVE SCP提供C-MOVE服务的端口 //在C-MOVE SCP端发出的C-STORE-RQ子操作请求的是C-MOVE SCU端我们实现的C-STORE SCP,C-STORE SCP绑定的端口是22345 client.Send("127.0.0.1", 12345,false, "DEST-AE", "SCP-AE"); Console.ReadLine(); }
public void Print() { var dicomClient = new DicomClient(); dicomClient.AddRequest(new DicomNCreateRequest(FilmSession.SOPClassUID, FilmSession.SOPInstanceUID, 0) { Dataset = FilmSession }); foreach (var filmbox in FilmSession.BasicFilmBoxes) { var imageBoxRequests = new List<DicomNSetRequest>(); var filmBoxRequest = new DicomNCreateRequest(FilmBox.SOPClassUID, filmbox.SOPInstanceUID, 0) { Dataset = filmbox }; filmBoxRequest.OnResponseReceived = (request, response) => { if (response.HasDataset) { var seq = response.Dataset.Get<DicomSequence>(DicomTag.ReferencedImageBoxSequence); for (int i = 0; i < seq.Items.Count; i++) { var req = imageBoxRequests[i]; var imageBox = req.Dataset; var sopInstanceUid = seq.Items[i].Get<string>(DicomTag.ReferencedSOPInstanceUID); imageBox.Add(DicomTag.SOPInstanceUID, sopInstanceUid); req.Command.Add(DicomTag.RequestedSOPInstanceUID, sopInstanceUid); } } }; dicomClient.AddRequest(filmBoxRequest); foreach (var image in filmbox.BasicImageBoxes) { var req = new DicomNSetRequest(image.SOPClassUID, image.SOPInstanceUID) { Dataset = image }; imageBoxRequests.Add(req); dicomClient.AddRequest(req); } } dicomClient.AddRequest(new DicomNActionRequest(FilmSession.SOPClassUID, FilmSession.SOPInstanceUID, 0x0001)); dicomClient.Send(RemoteAddress, RemotePort, false, CallingAE, CalledAE); }