Korzystanie z interfejsów API języka C# i DICOMweb w warstwie Standardowa

W tym artykule pokazano, jak pracować z usługą DICOMweb przy użyciu języka C# i przykładowych plików DCM DICOM®.

Użyj tych przykładowych plików:

  • blue-circle.dcm
  • dicom-metadata.csv
  • zielony kwadrat.dcm
  • czerwony trójkąt.dcm

Nazwa pliku, studyUID, seriesUID i instanceUID przykładowych plików DICOM to:

Plik Identyfikator UID badania SeriesUID InstanceUID
zielony kwadrat.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
czerwony trójkąt.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

Uwaga

Każdy z tych plików reprezentuje pojedyncze wystąpienie i jest częścią tego samego badania. Ponadto zielony kwadrat i czerwony trójkąt są częścią tej samej serii, podczas gdy niebieski okrąg znajduje się w oddzielnej serii.

Wymagania wstępne

Aby korzystać z interfejsów API DICOMweb Standard, potrzebne jest wystąpienie wdrożonej usługi DICOM. Aby uzyskać więcej informacji, zobacz Wdrażanie usługi DICOM przy użyciu witryny Azure Portal.

Po wdrożeniu wystąpienia usługi DICOM pobierz adres URL usługi App Service:

  1. Zaloguj się w witrynie Azure Portal.
  2. Wyszukaj ostatnie zasoby i wybierz wystąpienie usługi DICOM.
  3. Skopiuj adres URL usługi DICOM. Pamiętaj, aby określić wersję jako część adresu URL podczas tworzenia żądań. Aby uzyskać więcej informacji, zobacz Przechowywanie wersji interfejsu API dla usługi DICOM.

W aplikacji zainstaluj następujące pakiety NuGet:

Tworzenie klienta DicomWebClient

Po wdrożeniu usługi DICOM należy utworzyć klienta DicomWebClient. Uruchom fragment kodu, aby utworzyć element DicomWebClient, który jest używany w pozostałej części tego samouczka. Upewnij się, że masz zainstalowane oba pakiety NuGet. Aby uzyskać więcej informacji, zobacz Uzyskiwanie tokenu dostępu dla usługi DICOM przy użyciu interfejsu wiersza polecenia platformy 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}”); 

Za pomocą obiektu DicomWebClient możemy teraz wykonywać operacje Store, Retrieve, Search i Delete.

Przechowywanie wystąpień DICOM (STOW)

Za pomocą programu DicomWebClient możemy teraz przechowywać pliki DICOM.

Przechowywanie pojedynczego wystąpienia

Przechowywanie pojedynczego wystąpienia pokazuje, jak przekazać pojedynczy plik DICOM.

Szczegóły:

  • POST /studies
DicomFile dicomFile = await DicomFile.OpenAsync(@"{Path To blue-circle.dcm}");
DicomWebResponse response = await client.StoreAsync(new[] { dicomFile });

Przechowywanie wystąpień dla określonego badania

Wystąpienia sklepów dla określonego badania pokazują, jak przekazać plik DICOM do określonego badania.

Szczegóły:

  • 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");

Przed przejściem do następnej części samouczka przekaż green-square.dcm plik przy użyciu jednej z powyższych metod.

Pobieranie wystąpienia DICOM (WADO)

Fragmenty kodu pokazują, jak wykonać każde z zapytań pobierania przy użyciu utworzonego wcześniej elementu DicomWebClient.

Zmienne są używane w pozostałych przykładach:

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

Pobieranie wszystkich wystąpień w ramach badania

Szczegóły:

  • GET /studies/{study}
DicomWebResponse response = await client.RetrieveStudyAsync(studyInstanceUid);

Wszystkie trzy przekazane wcześniej pliki dcm są częścią tego samego badania, więc odpowiedź powinna zwrócić wszystkie trzy wystąpienia. Sprawdź, czy odpowiedź ma kod stanu OK i czy zwracane są wszystkie trzy wystąpienia.

Korzystanie z pobranych wystąpień

Poniższy fragment kodu pokazuje, jak uzyskać dostęp do pobranych wystąpień. Pokazano również, jak uzyskać dostęp do niektórych pól wystąpień i jak zapisać je jako plik 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");
}

Pobieranie metadanych wszystkich wystąpień w badaniu

Ta odpowiedź pobiera metadane dla wszystkich wystąpień w ramach pojedynczego badania.

Szczegóły:

  • GET /studies/{study}/metadata
DicomWebResponse response = await client.RetrieveStudyMetadataAsync(studyInstanceUid);

Wszystkie trzy przekazane wcześniej pliki dcm są częścią tego samego badania, więc odpowiedź powinna zwrócić metadane dla wszystkich trzech wystąpień. Sprawdź, czy odpowiedź ma kod stanu OK i czy wszystkie metadane są zwracane.

Pobieranie wszystkich wystąpień w serii

Ta odpowiedź pobiera wszystkie wystąpienia w ramach jednej serii.

Szczegóły:

  • GET /studies/{study}/series/{series}
DicomWebResponse response = await client.RetrieveSeriesAsync(studyInstanceUid, seriesInstanceUid);

Ta seria ma dwa wystąpienia (zielony kwadrat i czerwony trójkąt), więc odpowiedź powinna zwrócić oba wystąpienia. Sprawdź, czy odpowiedź ma kod stanu OK i czy oba wystąpienia są zwracane.

Pobieranie metadanych wszystkich wystąpień w serii

Ta odpowiedź pobiera metadane dla wszystkich wystąpień w ramach pojedynczego badania.

Szczegóły:

  • GET /studies/{study}/series/{series}/metadata
DicomWebResponse response = await client.RetrieveSeriesMetadataAsync(studyInstanceUid, seriesInstanceUid);

Ta seria ma dwa wystąpienia (zielony kwadrat i czerwony trójkąt), więc odpowiedź powinna zwracać metadane dla obu wystąpień. Sprawdź, czy odpowiedź ma kod stanu OK i czy zwracane są oba wystąpienia metadanych.

Pobieranie pojedynczego wystąpienia w ramach serii badania

To żądanie pobiera pojedyncze wystąpienie.

Szczegóły:

  • GET /studies/{study}/series{series}/instances/{instance}
DicomWebResponse response = await client.RetrieveInstanceAsync(studyInstanceUid, seriesInstanceUid, sopInstanceUid);

Ta odpowiedź powinna zwracać tylko czerwony trójkąt wystąpienia. Sprawdź, czy odpowiedź ma kod stanu OK i czy wystąpienie jest zwracane.

Pobieranie metadanych pojedynczego wystąpienia w ramach serii badania

To żądanie pobiera metadane dla pojedynczego wystąpienia w ramach pojedynczego badania i serii.

Szczegóły:

  • GET /studies/{study}/series/{series}/instances/{instance}/metadata
DicomWebResponse response = await client.RetrieveInstanceMetadataAsync(studyInstanceUid, seriesInstanceUid, sopInstanceUid);

Ta odpowiedź powinna zwracać tylko metadane dla wystąpienia czerwonego trójkąta. Sprawdź, czy odpowiedź ma kod stanu OK i czy metadane są zwracane.

Pobieranie co najmniej jednej ramki z jednego wystąpienia

To żądanie pobiera jedną lub więcej ramek z jednego wystąpienia.

Szczegóły:

  • GET /studies/{study}/series/{series}/instances/{instance}/frame/{frame}
DicomWebResponse response = await client.RetrieveFramesAsync(studyInstanceUid, seriesInstanceUid, sopInstanceUid, frames: new[] { 1 });

Ta odpowiedź powinna zwrócić jedyną ramkę z czerwonego trójkąta. Sprawdź, czy odpowiedź ma kod stanu OK i czy ramka jest zwracana.

Zapytanie DICOM (QIDO)

Uwaga

Zapoznaj się z instrukcją zgodności diCOM, aby uzyskać informacje o obsługiwanych atrybutach DICOM.

Wyszukiwanie badań

To żądanie wyszukuje co najmniej jedno badanie według atrybutów DICOM.

Szczegóły:

  • GET /studies? StudyInstanceUID={study}
string query = $"/studies?StudyInstanceUID={studyInstanceUid}";
DicomWebResponse response = await client.QueryAsync(query);

Sprawdza, czy odpowiedź zawiera jedno badanie i czy kod odpowiedzi jest ok.

Wyszukiwanie serii

To żądanie wyszukuje co najmniej jedną serię według atrybutów DICOM.

Szczegóły:

  • GET /series? SeriesInstanceUID={series}
string query = $"/series?SeriesInstanceUID={seriesInstanceUid}";
DicomWebResponse response = await client.QueryAsync(query);

Sprawdza, czy odpowiedź zawiera jedną serię i czy kod odpowiedzi jest ok.

Wyszukiwanie serii w ramach badania

To żądanie wyszukuje co najmniej jedną serię w ramach jednego badania według atrybutów DICOM.

Szczegóły:

  • GET /studies/{study}/series? SeriesInstanceUID={series}
string query = $"/studies/{studyInstanceUid}/series?SeriesInstanceUID={seriesInstanceUid}";
DicomWebResponse response = await client.QueryAsync(query);

Sprawdza, czy odpowiedź zawiera jedną serię i czy kod odpowiedzi jest ok.

Wyszukiwanie wystąpień

To żądanie wyszukuje co najmniej jedno wystąpienie według atrybutów DICOM.

Szczegóły:

  • GET /instances? SOPInstanceUID={instance}
string query = $"/instances?SOPInstanceUID={sopInstanceUid}";
DicomWebResponse response = await client.QueryAsync(query);

Sprawdza, czy odpowiedź zawiera jedno wystąpienie i czy kod odpowiedzi jest ok.

Wyszukiwanie wystąpień w badaniu

To żądanie wyszukuje co najmniej jedno wystąpienie w ramach jednego badania według atrybutów DICOM.

Szczegóły:

  • GET /studies/{study}/instances? SOPInstanceUID={instance}
string query = $"/studies/{studyInstanceUid}/instances?SOPInstanceUID={sopInstanceUid}";
DicomWebResponse response = await client.QueryAsync(query);

Sprawdza, czy odpowiedź zawiera jedno wystąpienie i czy kod odpowiedzi jest ok.

Wyszukiwanie wystąpień w ramach badania i serii

To żądanie wyszukuje co najmniej jedno wystąpienie w ramach jednego badania i pojedynczej serii według atrybutów DICOM.

Szczegóły:

  • GET /studies/{study}/series/{series}instances? SOPInstanceUID={instance}
string query = $"/studies/{studyInstanceUid}/series/{seriesInstanceUid}/instances?SOPInstanceUID={sopInstanceUid}";
DicomWebResponse response = await client.QueryAsync(query);

Sprawdza, czy odpowiedź zawiera jedno wystąpienie i czy kod odpowiedzi jest ok.

Usuwanie narzędzia DICOM

Uwaga

Usuwanie nie jest częścią standardu DICOM, ale zostało dodane dla wygody.

Usuwanie określonego wystąpienia w ramach badania i serii

To żądanie usuwa pojedyncze wystąpienie w ramach pojedynczej serii badania i pojedynczej serii.

Szczegóły:

  • DELETE /studies/{study}/series/{series}/instances/{instance}
string sopInstanceUidRed = "1.2.826.0.1.3680043.8.498.47359123102728459884412887463296905395";
DicomWebResponse response = await client.DeleteInstanceAsync(studyInstanceUid, seriesInstanceUid, sopInstanceUidRed);

Spowoduje to usunięcie wystąpienia czerwonego trójkąta z serwera. Jeśli to się powiedzie, kod stanu odpowiedzi nie zawiera zawartości.

Usuwanie określonej serii w ramach badania

To żądanie usuwa pojedynczą serię (i wszystkie wystąpienia podrzędne) w ramach pojedynczego badania.

Szczegóły:

  • DELETE /studies/{study}/series/{series}
DicomWebResponse response = await client.DeleteSeriesAsync(studyInstanceUid, seriesInstanceUid);

Ta odpowiedź usuwa wystąpienie green-square (jest to jedyny element pozostawiony w serii) z serwera. Jeśli to się powiedzie, kod stanu odpowiedzi nie zawiera zawartości.

Usuwanie określonego badania

To żądanie usuwa pojedyncze badanie (oraz wszystkie podrzędne serie i wystąpienia).

Szczegóły:

  • DELETE /studies/{study}
DicomWebResponse response = await client.DeleteStudyAsync(studyInstanceUid);

Ta odpowiedź usuwa wystąpienie niebieskiego okręgu (jest to jedyny element pozostawiony w serii) z serwera. Jeśli to się powiedzie, kod stanu odpowiedzi nie zawiera zawartości.

Uwaga

DICOM® jest zastrzeżonym znakiem towarowym National Electrical Manufacturers Association for its Standards publikacji odnoszących się do cyfrowej komunikacji informacji medycznych.