Esempio n. 1
0
        public async Task GivenStoredInstances_WhenRetrieveRequestForInstance_ThenInstanceIsRetrievedSuccessfully()
        {
            // Add multiple instances to validate that we return the requested instance and ignore the other(s).
            List <VersionedInstanceIdentifier> versionedInstanceIdentifiers = SetupInstanceIdentifiersList(ResourceType.Instance);

            // For the first instance identifier, set up the fileStore to return a stream containing a file associated with the identifier.
            KeyValuePair <DicomFile, Stream> streamAndStoredFile = StreamAndStoredFileFromDataset(GenerateDatasetsFromIdentifiers(versionedInstanceIdentifiers.First())).Result;

            _fileStore.GetFileAsync(streamAndStoredFile.Key.Dataset.ToVersionedInstanceIdentifier(0), DefaultCancellationToken).Returns(streamAndStoredFile.Value);

            RetrieveResourceResponse response = await _retrieveResourceService.GetInstanceResourceAsync(
                new RetrieveResourceRequest(
                    _studyInstanceUid,
                    _firstSeriesInstanceUid,
                    _sopInstanceUid,
                    new[] { AcceptHeaderHelpers.CreateAcceptHeaderForGetInstance() }),
                DefaultCancellationToken);

            // Validate response status code and ensure response stream has expected file - it should be equivalent to what the store was set up to return.
            ValidateResponseStreams(new List <DicomFile>()
            {
                streamAndStoredFile.Key
            }, response.ResponseStreams);

            // Dispose created streams.
            streamAndStoredFile.Value.Dispose();
        }
Esempio n. 2
0
        public async Task GivenStoredInstancesWithFrames_WhenRetrieveRequestForFrames_ThenFramesInInstanceAreRetrievedSuccesfully()
        {
            // Add multiple instances to validate that we return the requested instance and ignore the other(s).
            List <VersionedInstanceIdentifier> versionedInstanceIdentifiers = SetupInstanceIdentifiersList(ResourceType.Frames);
            var framesToRequest = new List <int> {
                1, 2
            };

            // For the first instance identifier, set up the fileStore to return a stream containing a file associated with the identifier.
            KeyValuePair <DicomFile, Stream> streamAndStoredFile = StreamAndStoredFileFromDataset(GenerateDatasetsFromIdentifiers(versionedInstanceIdentifiers.First()), frames: 3).Result;

            _fileStore.GetFileAsync(versionedInstanceIdentifiers.First(), DefaultCancellationToken).Returns(streamAndStoredFile.Value);

            // Setup frame handler to return the frames as streams from the file.
            Stream[] frames = framesToRequest.Select(f => GetFrameFromFile(streamAndStoredFile.Key.Dataset, f)).ToArray();
            var      retrieveResourceRequest = new RetrieveResourceRequest(_studyInstanceUid, _firstSeriesInstanceUid, _sopInstanceUid, framesToRequest, new[] { AcceptHeaderHelpers.CreateAcceptHeaderForGetFrame() });

            _dicomFrameHandler.GetFramesResourceAsync(streamAndStoredFile.Value, retrieveResourceRequest.Frames, true, "*").Returns(frames);

            RetrieveResourceResponse response = await _retrieveResourceService.GetInstanceResourceAsync(
                retrieveResourceRequest,
                DefaultCancellationToken);

            // Validate response status code and ensure response streams has expected frames - it should be equivalent to what the store was set up to return.
            AssertPixelDataEqual(DicomPixelData.Create(streamAndStoredFile.Key.Dataset).GetFrame(framesToRequest[0]), response.ResponseStreams.ToList()[0]);
            AssertPixelDataEqual(DicomPixelData.Create(streamAndStoredFile.Key.Dataset).GetFrame(framesToRequest[1]), response.ResponseStreams.ToList()[1]);

            streamAndStoredFile.Value.Dispose();
        }
Esempio n. 3
0
        public async Task GivenStoredInstances_WhenRetrieveRequestForSeries_ThenInstancesInSeriesAreRetrievedSuccesfully()
        {
            // Add multiple instances to validate that we return the requested instance and ignore the other(s).
            List <VersionedInstanceIdentifier> versionedInstanceIdentifiers = SetupInstanceIdentifiersList(ResourceType.Series);

            // For each instance identifier, set up the fileStore to return a stream containing a file associated with the identifier.
            var streamsAndStoredFiles = versionedInstanceIdentifiers
                                        .Select(x => StreamAndStoredFileFromDataset(GenerateDatasetsFromIdentifiers(x)).Result)
                                        .ToList();

            streamsAndStoredFiles.ForEach(x => _fileStore.GetFileAsync(x.Key.Dataset.ToVersionedInstanceIdentifier(0), DefaultCancellationToken).Returns(x.Value));

            RetrieveResourceResponse response = await _retrieveResourceService.GetInstanceResourceAsync(
                new RetrieveResourceRequest(
                    _studyInstanceUid,
                    _firstSeriesInstanceUid,
                    new[] { AcceptHeaderHelpers.CreateAcceptHeaderForGetSeries() }),
                DefaultCancellationToken);

            // Validate response status code and ensure response streams have expected files - they should be equivalent to what the store was set up to return.
            ValidateResponseStreams(streamsAndStoredFiles.Select(x => x.Key), response.ResponseStreams);

            // Dispose created streams.
            streamsAndStoredFiles.ToList().ForEach(x => x.Value.Dispose());
        }
Esempio n. 4
0
        public async Task GivenSpecificTransferSyntax_WhenRetrieveRequestForStudy_ThenInstancesInStudyAreTranscodedSuccesfully()
        {
            // Add multiple instances to validate that we return the requested instance and ignore the other(s).
            List <VersionedInstanceIdentifier> versionedInstanceIdentifiers = SetupInstanceIdentifiersList(ResourceType.Study);

            // For each instance identifier, set up the fileStore to return a stream containing a file associated with the identifier.
            var streamsAndStoredFiles = versionedInstanceIdentifiers.Select(
                x => StreamAndStoredFileFromDataset(GenerateDatasetsFromIdentifiers(x)).Result).ToList();

            streamsAndStoredFiles.ForEach(x => _fileStore.GetFileAsync(x.Key.Dataset.ToVersionedInstanceIdentifier(0), DefaultCancellationToken).Returns(x.Value));

            string transferSyntax = "1.2.840.10008.1.2.1";

            streamsAndStoredFiles.ForEach(x => _retrieveTranscoder.TranscodeFileAsync(x.Value, transferSyntax).Returns(x.Value));

            RetrieveResourceResponse response = await _retrieveResourceService.GetInstanceResourceAsync(
                new RetrieveResourceRequest(_studyInstanceUid, new[] { AcceptHeaderHelpers.CreateAcceptHeaderForGetStudy(transferSyntax: transferSyntax) }),
                DefaultCancellationToken);

            // Validate response status code and ensure response streams have expected files - they should be equivalent to what the store was set up to return.
            ValidateResponseStreams(streamsAndStoredFiles.Select(x => x.Key), response.ResponseStreams);

            // Validate dicom request is populated with correct transcode values
            ValidateDicomRequestIsPopulated(true, response.ResponseStreams.Sum(s => s.Length));

            // Dispose created streams.
            streamsAndStoredFiles.ToList().ForEach(x => x.Value.Dispose());
        }
        public async Task <IActionResult> GetStudyAsync(string studyInstanceUid)
        {
            _logger.LogInformation("DICOM Web Retrieve Transaction request received, for study: {studyInstanceUid}.", studyInstanceUid);

            RetrieveResourceResponse response = await _mediator.RetrieveDicomStudyAsync(studyInstanceUid, HttpContext.Request.GetAcceptHeaders(), HttpContext.RequestAborted);

            return(CreateResult(response));
        }
#pragma warning disable CA1801 // Review unused parameters
        public async Task <IActionResult> GetStudyAsync([ModelBinder(typeof(TransferSyntaxModelBinder))] string transferSyntax, string studyInstanceUid)
#pragma warning restore CA1801 // Review unused parameters
        {
            _logger.LogInformation($"DICOM Web Retrieve Transaction request received, for study: '{studyInstanceUid}'.");

            RetrieveResourceResponse response = await _mediator.RetrieveDicomStudyAsync(studyInstanceUid, HttpContext.Request.GetAcceptHeaders(), HttpContext.RequestAborted);

            return(CreateResult(response));
        }
        public async Task <IActionResult> GetFramesAsync(
            string studyInstanceUid,
            string seriesInstanceUid,
            string sopInstanceUid,
            [ModelBinder(typeof(IntArrayModelBinder))] int[] frames)
        {
            _logger.LogInformation("DICOM Web Retrieve Transaction request received, for study: {studyInstanceUid}, series: {seriesInstanceUid}, instance: {sopInstanceUid}, frames: {frames}.", studyInstanceUid, seriesInstanceUid, sopInstanceUid, string.Join(", ", frames ?? Array.Empty <int>()));
            RetrieveResourceResponse response = await _mediator.RetrieveDicomFramesAsync(
                studyInstanceUid, seriesInstanceUid, sopInstanceUid, frames, HttpContext.Request.GetAcceptHeaders(), HttpContext.RequestAborted);

            return(CreateResult(response));
        }
Esempio n. 8
0
        public async Task GivenStoredInstances_WhenRetrieveRequestForStudy_ThenInstancesInStudyAreRetrievedSuccesfully()
        {
            List <DicomDataset> datasets = new List <DicomDataset>();

            datasets.AddRange(await GenerateDicomDatasets(_firstSeriesInstanceUid, 2, true));
            datasets.AddRange(await GenerateDicomDatasets(_secondSeriesInstanceUid, 1, true));

            RetrieveResourceResponse response = await _retrieveResourceService.GetInstanceResourceAsync(
                new RetrieveResourceRequest(_studyInstanceUid, new[] { AcceptHeaderHelpers.CreateAcceptHeaderForGetStudy() }),
                _defaultCancellationToken);

            ValidateResponseDicomFiles(response.ResponseStreams, datasets.Select(ds => ds));
        }
        public async Task GivenStoredInstances_WhenRetrieveRequestForSeries_ThenInstancesInSeriesAreRetrievedSuccesfully()
        {
            var datasets = new List <DicomDataset>();

            datasets.AddRange(await GenerateDicomDatasets(_firstSeriesInstanceUid, 2, true));
            datasets.AddRange(await GenerateDicomDatasets(_secondSeriesInstanceUid, 1, true));

            RetrieveResourceResponse response = await _retrieveResourceService.GetInstanceResourceAsync(
                new RetrieveResourceRequest(_studyInstanceUid, _firstSeriesInstanceUid, new[] { AcceptHeaderHelpers.CreateAcceptHeaderForGetSeries() }),
                CancellationToken.None);

            ValidateResponseDicomFiles(response.ResponseStreams, datasets.Select(ds => ds).Where(ds => ds.ToInstanceIdentifier().SeriesInstanceUid == _firstSeriesInstanceUid));
            ValidateDicomRequestIsPopulated();
        }
        public async Task <IActionResult> GetInstanceAsync(
            string studyInstanceUid,
            string seriesInstanceUid,
            string sopInstanceUid)
        {
            _logger.LogInformation("DICOM Web Retrieve Transaction request received, for study: '{studyInstanceUid}', series: '{seriesInstanceUid}', instance: '{sopInstanceUid}'.", studyInstanceUid, seriesInstanceUid, sopInstanceUid);

            RetrieveResourceResponse response = await _mediator.RetrieveDicomInstanceAsync(
                studyInstanceUid, seriesInstanceUid, sopInstanceUid, HttpContext.Request.GetAcceptHeaders(), HttpContext.RequestAborted);

            return(new ObjectResult(response.ResponseStreams.First())
            {
                StatusCode = (int)HttpStatusCode.OK,
            });
        }
Esempio n. 11
0
        public async Task GivenARequestWithValidInstanceIdentifier_WhenRetrievingFrames_ThenNoExceptionIsThrown()
        {
            string studyInstanceUid  = TestUidGenerator.Generate();
            string seriesInstanceUid = TestUidGenerator.Generate();
            string sopInstanceUid    = TestUidGenerator.Generate();

            RetrieveResourceResponse expectedResponse = new RetrieveResourceResponse(Enumerable.Empty <Stream>(), KnownContentTypes.ApplicationOctetStream);
            RetrieveResourceRequest  request          = new RetrieveResourceRequest(studyInstanceUid, seriesInstanceUid, sopInstanceUid, new List <int> {
                1
            }, new[] { AcceptHeaderHelpers.CreateAcceptHeaderForGetFrame() });

            _retrieveResourceService.GetInstanceResourceAsync(request, CancellationToken.None).Returns(expectedResponse);

            RetrieveResourceResponse response = await _retrieveResourceHandler.Handle(request, CancellationToken.None);

            Assert.Same(expectedResponse, response);
        }
#pragma warning disable CA1801 // Remove unused parameter
        public async Task <IActionResult> GetInstanceAsync(
            [ModelBinder(typeof(TransferSyntaxModelBinder))] string transferSyntax,
            string studyInstanceUid,
            string seriesInstanceUid,
            string sopInstanceUid)
        {
#pragma warning restore CA1801 // Remove unused parameter
            _logger.LogInformation($"DICOM Web Retrieve Transaction request received, for study: '{studyInstanceUid}', series: '{seriesInstanceUid}', instance: '{sopInstanceUid}'.");

            RetrieveResourceResponse response = await _mediator.RetrieveDicomInstanceAsync(
                studyInstanceUid, seriesInstanceUid, sopInstanceUid, HttpContext.Request.GetAcceptHeaders(), HttpContext.RequestAborted);

            return(new ObjectResult(response.ResponseStreams.First())
            {
                StatusCode = (int)HttpStatusCode.OK,
            });
        }
 private static IActionResult CreateResult(RetrieveResourceResponse response)
 {
     return(new MultipartResult((int)HttpStatusCode.OK, response.ResponseStreams.Select(x => new MultipartItem(response.ContentType, x)).ToList()));
 }