共用方式為


使用 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 入口網站部署 DICOM 服務

部署 DICOM 服務的執行個體之後,擷取應用程式服務的 URL:

  1. 登入 Azure 入口網站
  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 來執行儲存、擷取、搜尋和刪除作業。

儲存 DICOM 執行個體 (STOW)

使用 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);

您先前上傳的三個 dcm 檔案都是相同研究的一部分,因此回應應該會傳回這三個執行個體。 驗證回應的狀態碼為 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);

驗證回應是否包含一個研究,且回應碼為 OK。

搜尋系列

此要求會依據 DICOM 屬性搜尋一個或多個系列。

詳細資料

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

驗證回應是否包含一個系列,且回應碼為 OK。

搜尋研究中的系列

此要求會依據 DICOM 屬性搜尋單一研究中的一個或多個系列。

詳細資料

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

驗證回應是否包含一個系列,且回應碼為 OK。

搜尋執行個體

此要求會依據 DICOM 屬性搜尋一個或多個執行個體。

詳細資料

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

驗證回應是否包含一個執行個體,且回應碼為 OK。

搜尋研究內的執行個體

此要求會依據 DICOM 屬性搜尋單一研究中的一個或多個執行個體。

詳細資料

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

驗證回應是否包含一個執行個體,且回應碼為 OK。

搜尋研究與系列內的執行個體

此要求會依據 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);

驗證回應是否包含一個執行個體,且回應碼為 OK。

刪除 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® 是美國電氣製造商協會對於其與醫療資訊數位通訊相關的標準出版物的註冊商標。