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 .dcm plików DICOM®.
Użyj tych przykładowych plików:
- blue-circle.dcm
- dicom-metadata.csv
- green-square.dcm
- red-triangle.dcm
Nazwa pliku, studyUID, seriesUID i instanceUID przykładowych plików DICOM to:
Plik | Identyfikator UID badania | 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 |
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:
- Zaloguj się w witrynie Azure Portal.
- Wyszukaj ostatnie zasoby i wybierz wystąpienie usługi DICOM.
- 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żna 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);
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);
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);
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 });
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.QueryStudyAsync(query);
Sprawdź, 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.QuerySeriesAsync(query);
Sprawdź, 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.QueryStudySeriesAsync(studyInstanceUid, query);
Sprawdź, 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.QueryInstancesAsync(query);
Sprawdź, 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.QueryStudyInstanceAsync(studyInstanceUid, query);
Sprawdź, 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.QueryStudySeriesInstanceAsync(studyInstanceUid, seriesInstanceUid, query);
Sprawdź, 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);
Ta odpowiedź usuwa wystąpienie 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);
Odpowiedź usuwa wystąpienie green-square z serwera (jest to jedyny element pozostawiony w serii). 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);
Odpowiedź usuwa wystąpienie niebieskiego okręgu z serwera (jest to jedyny element pozostawiony w serii). 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.