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(); }
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(); }
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()); }
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)); }
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, }); }
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())); }