Condividi tramite


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:

  1. Accedere al portale di Azure.
  2. Cercare Risorse recenti e selezionare l'istanza del servizio DICOM.
  3. 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.