다음을 통해 공유


C# 및 DICOMweb 표준 API 사용

이 문서에서는 C# 및 샘플 .dcm DICOM® 파일을 사용하여 DICOMweb 서비스를 사용하는 방법을 보여줍니다.

다음 샘플 파일을 사용합니다.

  • blue-circle.dcm
  • dicom-metadata.csv
  • green-square.dcm
  • red-triangle.dcm

샘플 DICOM 파일의 파일 이름, studyUID, seriesUID 및 instanceUID는 다음과 같습니다.

파일 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

참고 항목

각 파일은 하나의 인스턴스를 나타내며 동일한 연구의 일부입니다. 또한 녹색 사각형과 빨간색 삼각형은 동일한 계열이며, 파란색 원은 별도의 계열입니다.

필수 조건

DICOMweb 표준 API를 사용하려면 배포된 DICOM 서비스 인스턴스가 필요합니다. 자세한 내용은 Azure Portal을 사용하여 DICOM 서비스 배포를 참조하세요.

DICOM 서비스의 인스턴스를 배포한 후 App Service의 URL을 검색합니다.

  1. Azure Portal에 로그인합니다.
  2. 최신 리소스를 검색하고 DICOM 서비스 인스턴스를 선택합니다.
  3. DICOM 서비스의 서비스 URL을 복사합니다. 요청할 때는 버전을 URL의 일부로 지정해야 합니다. 자세한 내용은 DICOM 서비스에 대한 API 버전 관리를 참조하세요.

애플리케이션에서 다음 NuGet 패키지를 설치합니다.

DicomWebClient 만들기

DICOM 서비스를 배포한 후 DicomWebClient를 만듭니다. 코드 조각을 실행하여 이 자습서의 나머지 부분에서 사용할 DicomWebClient를 만듭니다. 두 NuGet 패키지가 모두 설치되어 있는지 확인합니다. 자세한 내용은 Azure CLI를 사용하여 DICOM 서비스에 대한 액세스 토큰 가져오기를 참조하세요.

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}”); 

DicomWebClient를 사용하면 이제 저장, 검색, 검색 및 삭제 작업을 수행할 수 있습니다.

STOW(DICOM 인스턴스 저장)

DicomWebClient를 사용하여 이제 DICOM 파일을 저장할 수 있습니다.

저장소 단일 인스턴스

단일 인스턴스 저장에서는 단일 DICOM 파일을 업로드하는 방법을 보여 줍니다.

세부 정보:

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

특정 연구에 대한 인스턴스 저장

특정 연구에 대한 저장소 인스턴스는 DICOM 파일을 지정된 연구에 업로드하는 방법을 보여 줍니다.

세부 정보:

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

자습서의 다음 부분으로 이동하기 전에 앞의 방법 중 하나를 사용하여 green-square.dcm 파일을 업로드합니다.

DICOM 인스턴스 검색(WADO)

코드 조각은 이전에 만들어진 DicomWebClient를 사용하여 각 쿼리 쿼리를 수행하는 방법을 보여 줍니다.

변수는 나머지 예 전체에서 사용됩니다.

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

연구 내 모든 인스턴스 검색

세부 정보:

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

이전에 업로드한 3개의 dcm 파일은 모두 동일한 연구의 일부이므로 응답은 3개의 인스턴스를 모두 반환해야 합니다. 응답의 상태 코드가 OK이고 세 인스턴스가 모두 반환되는지 유효성을 검사합니다.

검색된 인스턴스 사용

다음 코드 조각은 검색된 인스턴스에 액세스하는 방법을 보여 줍니다. 또한 인스턴스의 일부 필드에 액세스하는 방법과 이를 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");
}

연구에서 모든 인스턴스의 메타데이터 검색

이 응답은 단일 연구 내의 모든 인스턴스에 대한 메타데이터를 검색합니다.

세부 정보:

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

이전에 업로드한 세 개의 dcm 파일은 모두 동일한 연구의 일부이므로 응답은 세 인스턴스 모두에 대한 메타데이터를 반환해야 합니다. 응답의 상태 코드가 OK이고 모든 메타데이터가 반환되었는지 유효성을 검사합니다.

계열 내 모든 인스턴스 검색

이 응답은 단일 시리즈 내의 모든 인스턴스를 검색합니다.

세부 정보:

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

이 시리즈에는 두 개의 인스턴스(녹색 사각형과 빨간색 삼각형)가 있으므로 응답은 두 인스턴스를 모두 반환해야 합니다. 응답의 상태 코드가 OK이고 두 인스턴스가 모두 반환되는지 유효성을 검사합니다.

계열 내에서 모든 인스턴스의 메타데이터 검색

이 응답은 단일 연구 내의 모든 인스턴스에 대한 메타데이터를 검색합니다.

세부 정보:

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

시리즈에는 두 개의 인스턴스(녹색 사각형과 빨간색 삼각형)가 있으므로 응답은 두 인스턴스 모두에 대한 메타데이터를 반환해야 합니다. 응답의 상태 코드가 OK이고 메타데이터의 두 인스턴스가 모두 반환되는지 유효성을 검사합니다.

단일 연구의 단일 계열 내에서 단일 인스턴스 검색

이 요청은 단일 인스턴스를 검색합니다.

세부 정보:

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

응답은 인스턴스 빨간색 삼각형만 반환해야 합니다. 응답의 상태 코드가 OK이고 인스턴스가 반환되는지 유효성을 검사합니다.

단일 연구의 단일 계열 내에서 단일 인스턴스의 메타데이터 검색

이 요청은 단일 연구 및 계열 내 단일 인스턴스에 대한 메타데이터를 검색합니다.

세부 정보:

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

응답은 빨간색 삼각형 인스턴스에 대한 메타데이터만 반환해야 합니다. 응답의 상태 코드가 OK이고 메타데이터가 반환되는지 유효성을 검사합니다.

단일 인스턴스에서 하나 이상의 프레임 검색

이 요청은 단일 인스턴스에서 하나 이상의 프레임을 검색합니다.

세부 정보:

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

응답은 빨간색 삼각형의 유일한 프레임을 반환해야 합니다. 응답의 상태 코드가 OK이고 프레임이 반환되는지 유효성을 검사합니다.

DICOM 쿼리(QIDO)

참고 항목

지원되는 DICOM 특성은 DICOM 적합성 문을 참조하세요.

연구 검색

이 요청은 DICOM 특성을 기준으로 하나 이상의 연구를 검색합니다.

세부 정보:

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

응답에 하나의 연구가 포함되어 있고 응답 코드가 정상인지 유효성을 검사합니다.

계열 검색

이 요청은 DICOM 특성을 기준으로 하나 이상의 시리즈를 검색합니다.

세부 정보:

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

응답에 하나의 계열이 포함되어 있고 응답 코드가 정상인지 유효성을 검사합니다.

연구 내 계열 검색

이 요청은 DICOM 특성을 기준으로 단일 연구 내에서 하나 이상의 시리즈를 검색합니다.

세부 정보:

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

응답에 하나의 계열이 포함되어 있고 응답 코드가 정상인지 유효성을 검사합니다.

인스턴스 검색

이 요청은 DICOM 특성을 기준으로 하나 이상의 인스턴스를 검색합니다.

세부 정보:

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

응답에 하나의 인스턴스가 포함되어 있고 응답 코드가 정상인지 유효성을 검사합니다.

연구 내 인스턴스 검색

이 요청은 DICOM 특성을 기준으로 단일 연구 내에서 하나 이상의 인스턴스를 검색합니다.

세부 정보:

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

응답에 하나의 인스턴스가 포함되어 있고 응답 코드가 정상인지 유효성을 검사합니다.

연구 및 계열 내 인스턴스 검색

이 요청은 DICOM 특성을 기준으로 단일 연구 및 단일 시리즈 내에서 하나 이상의 인스턴스를 검색합니다.

세부 정보:

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

응답에 하나의 인스턴스가 포함되어 있고 응답 코드가 정상인지 유효성을 검사합니다.

DICOM 삭제

참고 항목

삭제는 DICOM 표준의 일부가 아니지만 편의를 위해 추가되었습니다.

연구 및 계열 내 특정 인스턴스 삭제

이 요청은 단일 연구 및 단일 계열 내에서 단일 인스턴스를 삭제합니다.

세부 정보:

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

이 응답은 서버에서 빨간색 삼각형 인스턴스를 삭제합니다. 성공하면 응답 상태 코드에 콘텐츠가 포함되지 않습니다.

연구 내 특정 계열 삭제

이 요청은 단일 연구 내에서 단일 계열(및 모든 자식 인스턴스)을 삭제합니다.

세부 정보:

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

응답은 서버에서 녹색 사각형 인스턴스(시리즈에 남아 있는 유일한 요소)를 삭제합니다. 성공하면 응답 상태 코드에 콘텐츠가 포함되지 않습니다.

특정 연구 삭제

이 요청은 단일 연구(및 모든 자식 계열 및 인스턴스)를 삭제합니다.

세부 정보:

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

응답은 서버에서 파란색 원 인스턴스(시리즈에 남아 있는 유일한 요소)를 삭제합니다. 성공하면 응답 상태 코드에 콘텐츠가 포함되지 않습니다.

참고 항목

DICOM®은 의료 정보의 디지털 통신과 관련된 표준 간행물에 대한 미국 전기공업회의 등록 상표입니다.