Usare le API C# e DICOMweb Standard
Questo articolo illustra come usare il servizio DICOMweb con C# e file DICOM® con estensione dcm di esempio.
Usare questi file di esempio:
- blue-circle.dcm
- dicom-metadata.csv
- green-square.dcm
- red-triangle.dcm
Il nome file e i valori studyUID, seriesUID e instanceUID dei file DICOM di esempio sono:
file | StudyUID | SeriesUID | InstanceUID |
---|---|---|---|
green-square.dcm | 1.2.826.0.1.3680043.8.498.13230779778012324449356534479549187420 | 1.2.826.0.1.3680043.8.498.45787841905473114233124723359129632652 | 1.2.826.0.1.3680043.8.498.12714725698140337137334606354172323212 |
red-triangle.dcm | 1.2.826.0.1.3680043.8.498.13230779778012324449356534479549187420 | 1.2.826.0.1.3680043.8.498.45787841905473114233124723359129632652 | 1.2.826.0.1.3680043.8.498.47359123102728459884412887463296905395 |
blue-circle.dcm | 1.2.826.0.1.3680043.8.498.13230779778012324449356534479549187420 | 1.2.826.0.1.3680043.8.498.77033797676425927098669402985243398207 | 1.2.826.0.1.3680043.8.498.13273713909719068980354078852867170114 |
Nota
Ognuno di questi file rappresenta una singola istanza e fa parte dello stesso studio. I file green-square e red-triangle fanno inoltre parte della stessa serie, mentre il file blue-circle si trova in una serie separata.
Prerequisiti
Per usare le API DICOMweb Standard, è necessario avere un'istanza del servizio DICOM distribuita. Per altre informazioni, vedere Distribuire il servizio DICOM usando il portale di Azure.
Dopo aver distribuito un'istanza del servizio DICOM, recuperare l'URL per il servizio app:
- Accedere al portale di Azure.
- Cercare Risorse recenti e selezionare l'istanza del servizio DICOM.
- Copiare l'URL servizio del servizio DICOM. Assicurarsi di specificare la versione come parte dell'URL durante l'esecuzione di richieste. Per altre informazioni, vedere Controllo delle versioni dell'API per il servizio DICOM.
Nell'applicazione installare i pacchetti NuGet seguenti:
Creare un DicomWebClient
Dopo aver distribuito il servizio DICOM, si crea un DicomWebClient. Eseguire il frammento di codice per creare DicomWebClient, che verrà usato per il resto di questa esercitazione. Assicurarsi di aver installato entrambi i pacchetti NuGet. Per altre informazioni, vedere Ottenere il token di accesso per il servizio DICOM usando l'interfaccia della riga di comando di Azure.
string webServerUrl ="{Your DicomWeb Server URL}"
var httpClient = new HttpClient();
httpClient.BaseAddress = new Uri(webServerUrl);
IDicomWebClient client = new DicomWebClient(httpClient);
client.HttpClient.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", “{Your token value}”);
Con DicomWebClient è ora possibile eseguire le operazioni Store, Retrieve, Search e Delete.
Archiviare istanze DICOM (STOW)
Usando DicomWebClient, è ora possibile archiviare i file DICOM.
Store-single-instance
Store single instance illustra come caricare un singolo file DICOM.
Dettagli:
- POST /study
DicomFile dicomFile = await DicomFile.OpenAsync(@"{Path To blue-circle.dcm}");
DicomWebResponse response = await client.StoreAsync(new[] { dicomFile });
Archiviare istanze per uno studio specifico
Archiviare le istanze per uno studio specifico illustra come caricare un file DICOM in uno studio specificato.
Dettagli:
- POST /studies/{study}
DicomFile dicomFile = await DicomFile.OpenAsync(@"{Path To red-triangle.dcm}");
DicomWebResponse response = await client.StoreAsync(new[] { dicomFile }, "1.2.826.0.1.3680043.8.498.13230779778012324449356534479549187420");
Prima di passare alla parte successiva dell'esercitazione, caricare il file green-square.dcm
usando uno dei metodi precedenti.
Recuperare istanza di DICOM (WADO)
I frammenti di codice mostrano come eseguire ognuna delle query di recupero usando DicomWebClient creato in precedenza.
Le variabili vengono usate in tutti gli altri esempi.
string studyInstanceUid = "1.2.826.0.1.3680043.8.498.13230779778012324449356534479549187420"; //StudyInstanceUID for all 3 examples
string seriesInstanceUid = "1.2.826.0.1.3680043.8.498.45787841905473114233124723359129632652"; //SeriesInstanceUID for green-square and red-triangle
string sopInstanceUid = "1.2.826.0.1.3680043.8.498.47359123102728459884412887463296905395"; //SOPInstanceUID for red-triangle
Recuperare tutte le istanze all'interno di uno studio
Dettagli:
- GET /studies/{studio}
DicomWebResponse response = await client.RetrieveStudyAsync(studyInstanceUid);
Tutti e tre i file DCM caricati in precedenza fanno parte dello stesso studio, quindi la risposta dovrebbe restituire tutte e tre le istanze. Verificare che la risposta abbia un codice di stato OK e che vengano restituite tutte e tre le istanze.
Usare le istanze recuperate
Il frammento di codice seguente illustra come accedere alle istanze recuperate. Illustra anche come accedere ad alcuni campi delle istanze e come salvarle come file dcm.
DicomWebAsyncEnumerableResponse<DicomFile> response = await client.RetrieveStudyAsync(studyInstanceUid);
await foreach (DicomFile file in response)
{
string patientName = file.Dataset.GetString(DicomTag.PatientName);
string studyId = file.Dataset.GetString(DicomTag.StudyID);
string seriesNumber = file.Dataset.GetString(DicomTag.SeriesNumber);
string instanceNumber = file.Dataset.GetString(DicomTag.InstanceNumber);
file.Save($"<path_to_save>\\{patientName}{studyId}{seriesNumber}{instanceNumber}.dcm");
}
Recuperare i metadati di tutte le istanze in uno studio
Questa richiesta recupera i metadati per tutte le istanze all'interno di un singolo studio.
Dettagli:
- GET /studies/{studio}/metadata
DicomWebResponse response = await client.RetrieveStudyMetadataAsync(studyInstanceUid);
Tutti e tre i file dcm caricati in precedenza fanno parte dello stesso studio, quindi la risposta dovrebbe restituire i metadati per tutte e tre le istanze. Verificare che la risposta abbia un codice di stato OK e che vengano restituiti tutti i metadati.
Recuperare tutte le istanze all'interno di una serie
Questa risposta recupera tutte le istanze all'interno di una singola serie.
Dettagli:
- GET: ../studies/{studio}/series/{serie}
DicomWebResponse response = await client.RetrieveSeriesAsync(studyInstanceUid, seriesInstanceUid);
Questa serie ha due istanze (green-square e red-triangle), quindi la risposta deve restituire entrambe le istanze. Verificare che la risposta abbia un codice di stato OK e che vengano restituite entrambe le istanze.
Recuperare i metadati di tutte le istanze all'interno di una serie
Questa richiesta recupera i metadati per tutte le istanze all'interno di un singolo studio.
Dettagli:
- GET /studies/{studio}/series/{serie}/metadata
DicomWebResponse response = await client.RetrieveSeriesMetadataAsync(studyInstanceUid, seriesInstanceUid);
La serie ha due istanze (green-square e red-triangle), quindi la risposta deve restituire metadati per entrambe le istanze. Verificare che la risposta abbia un codice di stato OK e che vengano restituite entrambe le istanze dei metadati.
Recuperare una singola istanza all'interno di una serie di uno studio
Questa richiesta recupera una singola istanza.
Dettagli:
- GET /studies/{studio}/series/{serie}/instances/{istanza}
DicomWebResponse response = await client.RetrieveInstanceAsync(studyInstanceUid, seriesInstanceUid, sopInstanceUid);
La risposta deve restituire solo il file red-triangle dell'istanza. Verificare che la risposta abbia un codice di stato OK e che venga restituita l'istanza.
Recuperare i metadati di una singola istanza all'interno di una serie di uno studio
Questa richiesta recupera i metadati per una singola istanza all'interno di un singolo studio e serie.
Dettagli:
- GET /studies/{studio}/series/{serie}/instances/{istanza}/metadata
DicomWebResponse response = await client.RetrieveInstanceMetadataAsync(studyInstanceUid, seriesInstanceUid, sopInstanceUid);
Questa risposta deve restituire solo i metadati per il file red-triangle dell'istanza. Verificare che la risposta abbia un codice di stato OK e che vengano restituiti i metadati.
Recuperare uno o più frame da una singola istanza
Questa richiesta recupera uno o più frame da una singola istanza.
Dettagli:
- GET /studies/{studio}/series{serie}/instances/{istanza}/frames/{frame}
DicomWebResponse response = await client.RetrieveFramesAsync(studyInstanceUid, seriesInstanceUid, sopInstanceUid, frames: new[] { 1 });
Questa risposta deve restituire l'unico frame dal file red-triangle. Verificare che la risposta abbia un codice di stato OK e che venga restituito il frame.
,Query DICOM (QIDO)
Nota
Per informazioni sugli attributi DICOM supportati, vedere la Dichiarazione di conformità DICOM.
Ricerca di studi
Questa richiesta cerca uno o più studi in base agli attributi DICOM.
Dettagli:
- GET /studies?StudyInstanceUID={studio}
string query = $"/studies?StudyInstanceUID={studyInstanceUid}";
DicomWebResponse response = await client.QueryStudyAsync(query);
Verificare che la risposta includa uno studio e che il codice di risposta sia OK.
Cercare serie
Questa richiesta cerca uno o più serie in base agli attributi DICOM.
Dettagli:
- GET /series?SeriesInstanceUID={serie}
string query = $"/series?SeriesInstanceUID={seriesInstanceUid}";
DicomWebResponse response = await client.QuerySeriesAsync(query);
Verificare che la risposta includa una serie e che il codice di risposta sia OK.
Cercare serie all'interno di uno studio
Questa richiesta cerca una o più serie all'interno di un singolo studio in base agli attributi DICOM.
Dettagli:
- GET /studies/{studio}/series?SeriesInstanceUID={serie}
string query = $"/studies/{studyInstanceUid}/series?SeriesInstanceUID={seriesInstanceUid}";
DicomWebResponse response = await client.QueryStudySeriesAsync(studyInstanceUid, query);
Verificare che la risposta includa una serie e che il codice di risposta sia OK.
Cercare istanze
Questa richiesta cerca uno o più istanze in base agli attributi DICOM.
Dettagli:
- GET /instances?SOPInstanceUID={istanza}
string query = $"/instances?SOPInstanceUID={sopInstanceUid}";
DicomWebResponse response = await client.QueryInstancesAsync(query);
Verificare che la risposta includa un'istanza e che il codice di risposta sia OK.
Cercare istanze all'interno di uno studio
Questa richiesta cerca una o più istanze all'interno di un singolo studio in base agli attributi DICOM.
Dettagli:
- GET /studies/{studio}/instances?SOPInstanceUID={istanza}
string query = $"/studies/{studyInstanceUid}/instances?SOPInstanceUID={sopInstanceUid}";
DicomWebResponse response = await client.QueryStudyInstanceAsync(studyInstanceUid, query);
Verificare che la risposta includa un'istanza e che il codice di risposta sia OK.
Cercare istanze all'interno di uno studio e una serie
Questa richiesta cerca una o più istanze all'interno di un singolo studio e una singola serie in base agli attributi DICOM.
Dettagli:
- GET /studies/{studio}/series/{serie}/instances?SOPInstanceUID={istanza}
string query = $"/studies/{studyInstanceUid}/series/{seriesInstanceUid}/instances?SOPInstanceUID={sopInstanceUid}";
DicomWebResponse response = await client.QueryStudySeriesInstanceAsync(studyInstanceUid, seriesInstanceUid, query);
Verificare che la risposta includa un'istanza e che il codice di risposta sia OK.
Eliminare DICOM
Nota
L'eliminazione non fa parte dello standard DICOM, ma è stata aggiunta per praticità.
Eliminare un'istanza specifica all'interno di uno studio e di una serie
Questa richiesta elimina una singola istanza all'interno di un singolo studio e di una singola serie.
Dettagli:
- ELIMINARE: ../studies/{studio}/series/{serie}/instances/{istanza}
string sopInstanceUidRed = "1.2.826.0.1.3680043.8.498.47359123102728459884412887463296905395";
DicomWebResponse response = await client.DeleteInstanceAsync(studyInstanceUid, seriesInstanceUid, sopInstanceUidRed);
Questa risposta elimina l'istanza del triangolo rosso dal server. In caso di esito positivo, il codice di stato della risposta non include contenuto.
Eliminare una serie specifica all'interno di uno studio
Questa richiesta elimina una singola serie (e tutte le istanze figlio) all'interno di un singolo studio.
Dettagli:
- DELETE: ../studies/{studio}/series/{serie}
DicomWebResponse response = await client.DeleteSeriesAsync(studyInstanceUid, seriesInstanceUid);
La risposta elimina l'istanza del file green-square dal server. Si tratta dell'unico elemento rimasto nella serie. In caso di esito positivo, il codice di stato della risposta non include contenuto.
Eliminare uno studio specifico
Questa richiesta elimina un singolo studio (e tutte le serie e le istanze figlio).
Dettagli:
- ELIMINARE: ../studies/{studio}
DicomWebResponse response = await client.DeleteStudyAsync(studyInstanceUid);
La risposta elimina l'istanza del file blue-circle dal server. Si tratta dell'unico elemento rimasto nella serie. In caso di esito positivo, il codice di stato della risposta non include contenuto.
Nota
DICOM® è il marchio registrato della National Electrical Manufacturers Association per le sue pubblicazioni Standard relative alle comunicazioni digitali delle informazioni mediche.