本文介绍如何使用阿里云多款产品,实现云上部署医学数字成像和通信DICOM服务。

什么是DICOM

DICOM是传输、存储、检索、打印、处理和显示医学成像信息的国际标准,并且是医疗保健行业接受的主要医学成像标准。在数以万计的在用医学成像设备中,DICOM是部署最为广泛的医疗信息标准之一。DICOM确保医学影像符合质量标准,因而可以保证诊断准确性。大多数成像方式,包括计算机断层扫描 (CT)、磁共振成像 (MRI) 和超声扫描,都必须符合DICOM标准。更多信息,请参见DICOM

方案架构

DICOM服务部署架构图如下:

DICOM

部署架构图中涉及各项云服务的用途说明如下:

  • 函数计算(FC):用于处理用户请求,提供请求鉴权以及资源访问控制服务,并路由至DICOMweb服务。
  • 专有网络VPC:基于阿里云创建的自定义私有网络, 不同的专有网络之间二层逻辑隔离,您可以在自建的专有网络内创建和管理云产品实例,例如ECS实例、RDS PostgreSQL数据库实例等。
  • Serverless应用引擎(SAE):用于处理DICOMweb协议,将DICOM文件存储到OSS,将结构化数据存储到RDS PostgreSQL数据库实例。
  • 云服务器ECS:部署三台ECS实例。其中一台ECS实例用于部署DICOM管理模块,提供基于UI的管理界面。另外两台ECS实例分别用于部署两套LDAP服务,LDAP服务之间通过镜像模式同步数据。
  • RDS PostgreSQL数据库实例:用于存储结构化的DICOM资源。
  • 对象存储OSS:用于存储非结构化的DICOM资源。

前提条件

步骤一:创建专有网络和交换机

鉴于不同的专有网络之间的二层逻辑隔离,您可以通过专有网络来管理云产品实例,例如ECS实例、RDS PostgreSQL数据库实例等。创建专有网络后,您可以通过创建交换机为专有网络划分一个或多个子网。同一专有网络内的不同交换机之间内网互通。

  1. 在华东2(上海)地域创建名为vpc-dicom-sh、网段为172.18.0.0/16的专有网络。具体操作,请参见创建和管理专有网络
  2. 在华东2(上海)地域不同可用区创建两个交换机。
    • 在可用区L创建名为vsw-dicom-sh-l、网段为172.18.80.0/20的交换机。
    • 在可用区G创建名为vsw-dicom-sh-g、网段为172.18.16.0/20的交换机。

    具体操作,请参见创建交换机

步骤二:创建并配置RDS PostgreSQL数据库实例

创建RDS PostgreSQL数据库实例用于存储结构化的DICOM资源。RDS PostgreSQL实例创建完成后,您需要进行白名单设置等操作,确保能正常访问该实例。

  1. 创建RDS PostgreSQL数据库实例。
    1. 登录RDS售卖页面
    2. 基础资源页签,配置以下参数,然后单击下一步:实例配置
      配置项示例值
      计费方式按需选择按量付费包年包月
      地域选择华东2(上海)
      类型选择PostgreSQL,并从下拉列表中选择引擎13
      系列选择高可用版
      存储类型选择ESSD PL3 云盘
      主节点可用区选择上海可用区L
      备节点可用区选择上海可用区G
      实例规格选择CPU核数为2、内存为4 GB、最大连接数为400的通用型规格实例。
      存储空间选择1500 GB
    3. 实例配置页面,按如下说明配置各项参数,其他保留默认配置,然后单击下一步:确认订单
      配置项示例值
      VPC选择步骤一中创建的VPC: vpc-dicom-sh
      主节点交换机选择步骤一中创建的主节点交换机:vsw-dicom-sh-l
      备选节点交换机选择步骤一中创建的备选节点交换机:vsw-dicom-sh-g
  2. 配置RDS PostgreSQL数据库实例。
    创建RDS PostgreSQL实例后,您需要完成以下各项操作,才能正常访问该RDS实例。
    1. 为已创建的RDS PostgreSQL实例创建账号和数据库。具体操作,请参见创建账号和数据库
    2. RDS PostgreSQL数据库实例设置白名单。具体操作,请参见设置白名单
    3. 连接RDS PostgreSQL实例。具体操作,请参见连接PostgreSQL实例

步骤三:部署LDAP服务

基于dcm4che/slapd-dcm4chee镜像,采用OpenLDAP复制策略部署LDAP服务的操作步骤如下:

  1. 创建两台ECS实例,分别命名为ecs-dicom-ldap-l-01ecs-dicom-ldap-g-01。具体操作,请参见通过控制台使用ECS实例(快捷版)
    通过云服务器ECS管理控制台创建ECS实例ecs-dicom-ldap-l-01时,按以下要求完成指定配置项,其他选项保留默认配置。
    配置项示例值
    地域选择华东2(上海)
    可用区选择可用区L
    存储选择ESSD云盘40 GiBPL0(单盘IOPS性能上限1万)
    规格选择共享标准型s6 / ecs.s6-c1m2.large(2vCPU 4GiB)
    专有网络选择步骤一中创建的VPC: vpc-dicom-sh
    公共镜像选择Ubuntu 18.04 64

    ecs-dicom-ldap-l-01实例创建完成后,请参照以上配置项创建ecs-dicom-ldap-g-01,区别仅在于可用区需选择可用区G

  2. 登录ECS实例,执行以下命令完成初始化操作。
    apt-get update
    apt-get upgrade -y
    apt install ca-certificates curl gnupg pass lsb-release docker  docker-compose ldap-utils -y
  3. 执行以下命令从容器镜像服务ACR企业版实例中拉取镜像。
    docker login --username=****@test.aliyunid.com acr-ee-***-registry-vpc.cn-shanghai.cr.aliyuncs.com
    docker pull acr-ee-***-registry-vpc.cn-shanghai.cr.aliyuncs.com/dicom/slapd-dcm4chee:2.6.0-25.0
  4. 分别为以上创建的两台ECS实例ecs-dicom-ldap-l-01ecs-dicom-ldap-g-01配置镜像启动脚本。
    • ecs-dicom-ldap-l-01docker-compose.yml启动脚本配置如下:
      version: "3"
      services:
        ldap1:
          image: acr-ee-***-registry-vpc.cn-shanghai.cr.aliyuncs.com/dicom/slapd-dcm4chee:2.6.0-25.0
          environment:
            LDAP_URLS: "ldap://ldap1:389/"
            LDAP_REPLICATION_HOSTS: "ldap://ldap1:389/ ldap://172.18.18.105:389/"
          ports:
            - "389:389"
          volumes:
            - /var/local/dcm4chee-arc/ldap:/var/lib/openldap/openldap-data
            - /var/local/dcm4chee-arc/slapd.d:/etc/openldap/slapd.d
    • ecs-dicom-ldap-g-01docker-compose.yml启动脚本配置如下:
      version: "3"
      services:
        ldap2:
          image: acr-ee-***-registry-vpc.cn-shanghai.cr.aliyuncs.com/dicom/slapd-dcm4chee:2.6.0-25.0
          environment:
            LDAP_URLS: "ldap://ldap2:389/"
            LDAP_REPLICATION_HOSTS: "ldap://172.18.92.187:389/ ldap://ldap2:389/"
            SKIP_INIT_CONFIG: "true"
          ports:
            - "389:389"
          volumes:
            - /var/local/dcm4chee-arc/ldap:/var/lib/openldap/openldap-data
            - /var/local/dcm4chee-arc/slapd.d:/etc/openldap/slapd.d
  5. docker-compose.yml同级目录下,执行以下操作。
    1. 启动LDAP服务。
      docker-compose -p dcm4chee up -d
    2. 获取LDAP容器ID。
      docker container ls
    3. 开启同步功能。
      docker exec <ldap-container-id> prepare-replication
      docker exec <ldap-container-id> enable-replication
    4. 可选:查看同步配置状态。
      # -xw****为启动LDAP服务时配置的密钥。该参数可通过LDAP_ROOTPASS环境变量进行配置,默认值为secret。
      ldapsearch -LLLsbase -xw**** -Dcn=admin,dc=dcm4che,dc=org -b "dicomDeviceName=dcm4chee-arc,cn=Devices,cn=DICOM Configuration,dc=dcm4che,dc=org" dicomVendorData | head

      同步任务启动成功后,返回如下信息:

      dn: dicomDeviceName=dcm4chee-arc,cn=Devices,cn=DICOM Configuration,dc=dcm4che,
       dc=org
      dicomVendorData:: UEsDBBQAAAAAAKVbclMAAAAAAAAAAAAAAAALAAAAdGh1bWJuYWlscy9QSwME
       FAACAAgANWxIUhxjQjGkBgAAeQcAABEAAAB0aHVtYm5haWxzL2tvLnBuZ83V+zub5xsA8JdQh1Bpa
       ****
      说明 除以上配置项以外,slapd-dcm4chee镜像还支持配置其他参数。更多信息,请参见dcm4che-dockerfiles
  6. 创建负载均衡CLB实例。
    1. 登录传统型负载均衡CLB控制台
    2. 实例管理页面,单击创建传统型负载均衡
    3. 在实例购买页面,根据以下要求完成指定配置项,其他选项保留默认配置。
      配置项示例值
      地域和可用区地域选择华东2(上海),可用区选择华东2可用区L
      备可用区选择华东2可用区G
      实例名称输入slb-dicom-ldap
      实例规格选择简约型(slb.s1.small)
      实例类型选择私网
      网络类型选择专有网络
      专有网络选择步骤一中创建的VPC: vpc-dicom-sh
    4. 单击立即购买,然后按照页面指引完成订单支付。
  7. 配置负载均衡CLB实例。
    1. 实例管理页面,找到目标实例slb-dicom-ldap,然后在操作列单击监听配置向导
    2. 协议&监听配置向导,负载均衡协议选择TCP、监听端口选择389,然后单击下一步
    3. 后端服务器配置向导,单击主备服务器组,然后选择已创建的服务器组ecs-dicom-ldap-l-01ecs-dicom-ldap-g-01

步骤四:部署DICOM管控服务

以下步骤为基于dcm4che/dcm4chee-arc-psql镜像部署DICOM管控服务,该服务主要用于为运维人员提供管理和查询页面。本示例中采用单点部署,您可以根据实际的业务情况,选择其他部署方案。

  1. 创建名为ecs-dicom-arc-l-01ECS实例。具体操作,请参见通过控制台使用ECS实例(快捷版)
    通过云服务器ECS管理控制台创建ECS实例ecs-dicom-arc-l-01时,按以下要求完成指定配置项,其他选项保留默认配置。
    配置项示例值
    地域选择华东2(上海)
    可用区选择可用区L
    存储选择ESSD云盘100 GiBPL0(单盘IOPS性能上限1万)
    规格选择通用型 g7 / ecs.g7.xlarge(4vCPU 16 GiB)
    专有网络选择步骤一中创建的VPC: vpc-dicom-sh
    公共镜像选择Ubuntu 18.04 64
  2. 登录ECS实例,执行以下命令完成初始化操作。
    apt-get update
    apt-get upgrade -y
    apt install ca-certificates curl gnupg pass lsb-release docker  docker-compose postgresql-client-10 -y
  3. 执行以下命令从容器镜像服务ACR企业版实例中拉取镜像。
    docker login --username=****@test.aliyunid.com acr-ee-***-registry-vpc.cn-shanghai.cr.aliyuncs.com
    docker pull acr-ee-***-registry-vpc.cn-shanghai.cr.aliyuncs.com/dicom/dcm4chee-arc-psql:5.25.0
  4. 初始化数据库。
    1. dcm4chee-arc-5.25.0-psql.zip压缩包上传到ECS/home目录下,然后解压。
    2. 执行以下命令创建表和索引。
      psql -h pgm-uf***.pg.rds.aliyuncs.com pacsdb pacs < /home/dcm4chee-arc-5.25.0-psql/sql/create-psql.sql
      psql -h pgm-uf***.pg.rds.aliyuncs.com pacsdb pacs < /home/dcm4chee-arc-5.25.0-psql/sql/create-fk-index.sql
      psql -h pgm-uf***.pg.rds.aliyuncs.com pacsdb pacs < /home/dcm4chee-arc-5.25.0-psql/sql/create-case-insensitive-index.sql
  5. 配置启镜像启动脚本。
    1. 执行以下命令配置docker-compose.yml文件。
      version: "3"
      services:
        arc:
          image: acr-ee-***-registry-vpc.cn-shanghai.cr.aliyuncs.com/dicom/dcm4chee-arc-psql:5.25.0
          logging:
            driver: json-file
            options:
              max-size: "10m"
          ports:
            - "8080:8080"
            - "8443:8443"
            - "9990:9990"
            - "9993:9993"
            - "11112:11112"
            - "2762:2762"
            - "2575:2575"
            - "12575:12575"
          env_file: docker-compose.env
          environment:
            WILDFLY_CHOWN: /opt/wildfly/standalone
          volumes:
            - /etc/localtime:/etc/localtime:ro
            - /etc/timezone:/etc/timezone:ro
            - /var/local/dcm4chee-arc/wildfly:/opt/wildfly/standalone
    2. 执行以下命令配置docker-compose.env文件。
      其中,LDAP指向ecs-dicom-ldap-l-01
      POSTGRES_DB=pacsdb
      POSTGRES_USER=pacs
      POSTGRES_PASSWORD=pacs***
      POSTGRES_HOST=pgm-uf***.pg.rds.aliyuncs.com
      LDAP_URL=ldap://172.18.92.187:389
    3. docker-compose.yml同级目录下,执行以下命令启动容器镜像服务ARC。
      docker-compose -p dcm4chee up -d
    4. 可选:执行以下命令查看容器镜像服务ARC启动状态。
      tail -f /var/local/dcm4chee-arc/wildfly/log/server.log
  6. 添加OSS存储介质。
    1. 创建ldap_config.ldif文件,并通过LDAPldapadd导入配置参数。ldap_config.ldif配置内容如下:
      version: 1
      dn: dcmStorageID=alicloud-oss,dicomDeviceName=dcm4chee-arc,cn=Devices,cn=DICOM Configuration,dc=dcm4che,dc=org
      objectClass: dcmStorage
      dcmStorageID: alicloud-oss
      dcmURI: jclouds:s3:https://oss-cn-shanghai-internal.aliyuncs.com
      dcmDigestAlgorithm: MD5
      dcmProperty: container=examplebucket
      dcmProperty: jclouds.s3.virtual-host-buckets=true
      dcmProperty: credential=<secret-key>
      dcmProperty: identity=<access-key>
      dcmProperty: jclouds.strip-expect-header=true
      dcmProperty: containerExists=true
      dcmProperty: jclouds.trust-all-certs=true
    2. 执行以下命令导入配置文件。
      # -xw****为启动LDAP时配置的密钥。
      #172.18.92.175
      ldapadd -xw**** -D cn=admin,dc=dcm4che,dc=org -H ldap://172.18.92.187:389 -f ldap_config.ldif
  7. 配置OSS作为存储后端。
    1. 创建ldap_config.ldif文件,并通过LDAPldapadd导入配置参数。ldap_config.ldif配置内容如下:
      version: 1
      
      dn: dicomAETitle=DCM4CHEE,dicomDeviceName=dcm4chee-arc,cn=Devices,cn=DICOM Configuration,dc=dcm4che,dc=org
      changetype: modify
      replace: dcmObjectStorageID
      dcmObjectStorageID: alicloud-oss
    2. 执行以下命令导入配置文件。
      ldapmodify -xw**** -D cn=admin,dc=dcm4che,dc=org -H ldap://172.18.92.187:389 -f ldap_config.ldif
  8. 执行以下命令导入测试数据。
    docker run --network=dcm4chee_default --rm acr-ee-***-registry-vpc.cn-shanghai.cr.aliyuncs.com/dicom/dcm4che-tools:5.25.0 storescu -cDCM4CHEE@dcm4chee_arc_1:11112 /opt/dcm4che/etc/testdata/dicom

步骤五:部署DICOMweb服务

您需要在SAE应用中部署DICOMweb服务,部署完成后可添加私网SLB实现同VPC内所有应用间的互相访问。

  1. 创建应用。
    1. 登录Serverless应用引擎SAE控制台
    2. 在左侧导航栏,单击应用列表,然后单击创建应用
    3. 应用基本信息页面,按如下要求完成各配置项,然后单击下一步:应用部署配置
      配置项示例值
      应用名称输入DicomSerivce
      专有网络配置选择自定义配置,然后在右侧下拉选择已创建的VPC vpc-dicom-sh
      命名空间选择默认
      vSwitch选择已创建的交换机vsw-dicom-sh-lvsw-dicom-sh-g
      安全组选择已有的安全组。如果此前未创建安全组,请按照界面指引创建新的安全组。
      应用实例数选择2
      VCPU选择8 Core
      内存选择32 GiB
    4. 应用部署配置页面,按如下要求完成指定配置项,其他选项保持默认配置,然后单击下一步:确认规格
      配置项示例值
      应用部署方式选择镜像
      配置镜像选择我的阿里云镜像,并设置为dicom/dcm4chee-arc-psql:5.25.0
      环境变量输入以下内容:
      POSTGRES_USER = pacs
      POSTGRES_HOST = pgm-uf**.pg.rds.aliyuncs.com
      POSTGRES_PASSWORD = pacs****
      POSTGRES_DB = pacsdb
      LDAP_URL = ldap://172.18.92.189:389
    5. 按界面指引完成应用的创建。创建完成后,实例分配的IP地址分别为172.18.92.190172.18.18.113
  2. 为已创建的应用添加私网SLB访问,然后将HTTP端口配置为8080具体操作,请参见为应用绑定SLB
    配置完成后,您可以获取到的私网访问地址为172.18.92.191:8080
  3. 登录名为ecs-dicom-arc-l-01ECS实例,依次执行如下命令测试部署的实例以及私网SLB是否正常运行。
    curl -v "http://172.18.92.190:8080/dcm4chee-arc/aets/DCM4CHEE/rs/patients?limit=21&includefield=all&offset=0"
    curl -v "http://172.18.18.113:8080/dcm4chee-arc/aets/DCM4CHEE/rs/patients?limit=21&includefield=all&offset=0"
    curl -v "http://172.18.92.191:8080/dcm4chee-arc/aets/DCM4CHEE/rs/patients?limit=21&includefield=all&offset=0"

    正常情况返回信息如下:

    HTTP/1.1 200 OK
    < Date: Thu, 23 Dec 2021 13:25:25 GMT
    < Content-Type: application/dicom+json
    < Transfer-Encoding: chunked
    < Connection: keep-alive
    < Access-Control-Allow-Origin: *
    < Cache-Control: no-cache
    < Access-Control-Allow-Headers: origin, content-type, accept, authorization
    < Access-Control-Allow-Credentials: true
    < Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS, HEAD
    <
    * Connection #0 to host 172.18.92.191 left intact
    [{"00100010":{"vr":"PN","Value":[{"Alphabetic":"DOE^J1"}]},"00100020":{"vr":"LO","Value":["583295"]},"00100021":{"vr":"LO"},"00100030":{"vr":"DA"},"00100040":{"vr":"CS","Value":["M"]},"00201200":{"vr":"IS","Value":["1"]},"77770010":{"vr":"LO","Value":["DCM4CHEE Archive 5"]},"77771010":{"vr":"DT","Value":["20211223143303.778+0000"]},"77771011":{"vr":"DT","Value":["20211223143303.786+0000"]}

步骤六:部署访问网关

通过在函数计算中部署Nginx代理来转发请求,以提供访问管控和资源隔离的能力。

  1. 构建反向代理镜像。
    1. 登录名为ecs-dicom-arc-l-01ECS实例,在配置文件default.conf.template中编写转发规则。
      default.conf.template配置内容如下:
      upstream dicom_server
      {
          server ${DICOM_SERVER_HOST}:${DICOM_SERVER_PORT};
      }
      
      upstream ${DICOM_CUSTOM_DOMAIN}
      {
          server ${DICOM_SERVER_HOST}:${DICOM_SERVER_PORT};
      }
      
      server
      {
          listen 80;
          server_name  localhost;
      
          location ~/${DICOM_FUNCTION_PATH}/dcm4chee-arc/aets/DCM4CHEE/(rs|wado|dimes)/(.+){
              proxy_pass http://dicom_server/dcm4chee-arc/aets/DCM4CHEE/$1/$2;
          }
      
          location ~/dcm4chee-arc/aets/DCM4CHEE/(rs|wado|dimes)/(.+){
              proxy_pass http://${DICOM_CUSTOM_DOMAIN}/dcm4chee-arc/aets/DCM4CHEE/$1/$2;
          }
      
          location / {
              return 403;
          }
      }
    2. 在与default.conf.template文件同级目录下,编写Dockerfile文件,内容如下:
      FROM acr-ee-test-registry-vpc.cn-shanghai.cr.aliyuncs.com/dicom/nginx:1.21.4
      RUN  mkdir -p /etc/nginx/templates/
      COPY default.conf.template /etc/nginx/templates/default.conf.template
    3. 执行如下命令生成镜像,并推送到容器镜像服务中,待后续配置函数计算时使用。
      docker build -t acr-ee-***-registry-vpc.cn-shanghai.cr.aliyuncs.com/dicom/nginx:1.21.4-dicom-revproxy-0.1 .
      docker push acr-ee-***-registry-vpc.cn-shanghai.cr.aliyuncs.com/dicom/nginx:1.21.4-dicom-revproxy-0.1
  2. 配置域名解析到您的函数计算对应地域的Endpoint。具体操作,请参见配置域名解析
  3. 创建服务。
    1. 登录函数计算控制台
    2. 在左侧导航栏,单击服务及函数
    3. 在顶部菜单栏,选择华东2(上海)地域。
    4. 服务列表页面,单击创建服务
    5. 创建服务页面,填写服务名称dicomweb,然后单击确定
  4. 编辑服务。
    1. 服务列表页面,单击已创建的服务dicomweb右侧操作栏下的配置
    2. 编辑服务页面,角色配置、日志配置、链路追踪配置、存储配置区域均保持默认选项。仅需按如下要求完成网络配置区域的指定配置项。
      配置项示例值
      允许函数访问 VPC 内资源选中
      配置方式选中自定义配置
      专有网络选择已创建的专有网络vpc-dicom-sh
      交换机选择已创建的交换机vsw-dicom-sh-g
      允许函数访问公网选中
      仅允许指定 VPC 调用函数选中
  5. 创建函数。
    1. 单击已创建的服务名称dicomweb
    2. 函数管理页面,单击创建函数
    3. 创建函数页面,选中使用容器镜像创建,按如下要求完成指定配置项,其他选项保持默认配置。
      配置项示例值
      名称填写do
      容器镜像选择acr-ee-***-registry-vpc.cn-shanghai.cr.aliyuncs.com/dicom/nginx:1.21.4-dicom-revproxy-0.1
      监听端口输入80
      运行环境选择Custom Container
      单实例并发数选择100
      内存规格选择4 GB
      环境变量输入以下内容:
      # 填写为函数绑定的自定义域名。
      DICOM_CUSTOM_DOMAIN = www.dicomweb-***.com
      # 填写测试接口调用请求地址中的PATH。
      DICOM_FUNCTION_PATH = 2016-08-15/proxy/dicomweb.LATEST/do
      # 填写步骤五生成的私网访问地址。
      DICOM_SERVER_HOST = 172.18.92.191
      # 填写步骤五配置的端口号。
      DICOM_SERVER_PORT = 8080
      重要 启动通过函数计算Custom Container方式创建的访问网关服务时,耗时会达到200~300ms。您可以通过配置预留实例的方式降低冷启动对业务的影响。结合本示例场景,最小实例数配置为1,其他参数保持默认配置。其他场景请结合实际情况进行配置。具体操作,请参见弹性管理(含预留模式)
  6. 添加自定义域名www.dicomweb-***.com并添加路由配置。具体操作,请参见添加自定义域名
    按指定要求完成路由设置,其他选项保留默认配置。
    配置项示例值
    路径设置为/dcm4chee-arc/aets/DCM4CHEE/*
    服务名称选择dicomweb
    函数名称选择do
    版本或别名选择LATEST
  7. 测试接口调用情况。
    1. 单击创建的函数do
    2. 单击触发器管理页签,记录同步创建的触发器右侧的配置信息 > 公网中的请求地址 http://13****.cn-shanghai.fc.aliyuncs.com/2016-08-15/proxy/dicomweb.LATEST/do/
    3. 通过以下两种方式测试接口调用情况。
      • 通过默认地址测试接口调用情况
        • 查询patients信息
          curl -v "http://13****.cn-shanghai.fc.aliyuncs.com/2016-08-15/proxy/dicomweb.LATEST/do/dcm4chee-arc/aets/DCM4CHEE/rs/patients?limit=21&includefield=all&offset=0"

          正常情况下返回如下信息:

          [{"00100010":{"vr":"PN","Value":[{"Alphabetic":"DOE^J1"}]},"00100020":{"vr":"LO","Value":["583295"]},"00100030":{"vr":"DA"},"00100040":{"vr":"CS","Value":["M"]}}]
        • 查询PatientID583295studies信息:
          curl -v "http://www.dicomweb-***.com//dcm4chee-arc/aets/DCM4CHEE/rs/studies?limit=21&includefield=all&offset=0&PatientID=583295"

          正常情况下返回如下信息:

          [{"00080020":{"vr":"DA","Value":["20170716"]},"00080030":{"vr":"TM","Value":["154736"]},"00080050":{"vr":"SH","Value":["MOF5026"]},"00080054":{"vr":"AE","Value":["DCM4CHEE"]},"00080056":{"vr":"CS","Value":["ONLINE"]},"00080061":{"vr":"CS","Value":["MR"]},"00080090":{"vr":"PN","Value":[{"Alphabetic":"NELL^FREDERICK^P^DR"}]},"00081190":{"vr":"UR","Value":["http://dicom_server/dcm4chee-arc/aets/DCM4CHEE/rs/studies/1.113654.3.13.1026"]},"00100010":{"vr":"PN","Value":[{"Alphabetic":"DOE^J1"}]},"00100020":{"vr":"LO","Value":["583295"]},"00100030":{"vr":"DA"},"00100040":{"vr":"CS","Value":["M"]},"0020000D":{"vr":"UI","Value":["1.113654.3.13.1026"]},"00200010":{"vr":"SH","Value":["RP1026"]},"00201206":{"vr":"IS","Value":["1"]},"00201208":{"vr":"IS","Value":["16"]}}]
      • 通过域名的方式测试接口调用情况
        • 查询patients信息:
          curl -v "http://www.dicomweb-***.com/dcm4chee-arc/aets/DCM4CHEE/rs/patients?limit=21&includefield=all&offset=0"

          正常情况下返回如下信息:

          [{"00100010":{"vr":"PN","Value":[{"Alphabetic":"DOE^J1"}]},"00100020":{"vr":"LO","Value":["583295"]},"00100030":{"vr":"DA"},"00100040":{"vr":"CS","Value":["M"]}}]
        • 查询PatientID583295studies信息:
          curl -v "http://www.dicomweb-***.com/dcm4chee-arc/aets/DCM4CHEE/rs/studies?limit=21&includefield=all&offset=0&PatientID=583295"

          正常情况下返回如下信息:

          [{"00080020":{"vr":"DA","Value":["20170716"]},"00080030":{"vr":"TM","Value":["154736"]},"00080050":{"vr":"SH","Value":["MOF5026"]},"00080054":{"vr":"AE","Value":["DCM4CHEE"]},"00080056":{"vr":"CS","Value":["ONLINE"]},"00080061":{"vr":"CS","Value":["MR"]},"00080090":{"vr":"PN","Value":[{"Alphabetic":"NELL^FREDERICK^P^DR"}]},"00081190":{"vr":"UR","Value":["http://www.dicomweb-***.com/dcm4chee-arc/aets/DCM4CHEE/rs/studies/1.113654.3.13.1026"]},"00100010":{"vr":"PN","Value":[{"Alphabetic":"DOE^J1"}]},"00100020":{"vr":"LO","Value":["583295"]},"00100030":{"vr":"DA"},"00100040":{"vr":"CS","Value":["M"]},"0020000D":{"vr":"UI","Value":["1.113654.3.13.1026"]},"00200010":{"vr":"SH","Value":["RP1026"]},"00201206":{"vr":"IS","Value":["1"]},"00201208":{"vr":"IS","Value":["16"]}}]
        • 上传DICOM数据:
          echo -ne "\r\n--myboundary\r\nContent-Type: application/dicom\r\n\r\n" > mime.dicom.head
          echo -ne "\r\n--myboundary--" > mime.tail
          cat mime.dicom.head dicom-file1.dcm mime.tail > dicom.mime
          curl -X POST -H "Content-Type: multipart/related; type=\"application/dicom\"; boundary=myboundary"  http://www.dicomweb-***.com/dcm4chee-arc/aets/DCM4CHEE/rs/studies --data-binary @dicom.mime

          正常情况下返回如下信息:

          {"00081190":{"vr":"UR","Value":["http://www.dicomweb-***.com/dcm4chee-arc/aets/DCM4CHEE/rs/studies/2.25.69929638918751914792556351597790946979"]},"00081199":{"vr":"SQ","Value":[{"00081150":{"vr":"UI","Value":["2.25.326410046515557697819279767240864278552"]},"00081155":{"vr":"UI","Value":["2.25.117261743442166561672617116550216377921"]},"00081190":{"vr":"UR","Value":["http://www.dicomweb-***.com/dcm4chee-arc/aets/DCM4CHEE/rs/studies/2.25.69929638918751914792556351597790946979/series/2.25.144996685350575051252979153755370108609/instances/2.25.117261743442166561672617116550216377921"]}}]}}
  8. 配置访问鉴权。
    默认情况下,支持匿名调用触发器函数,即任何人都可以发送请求来调用函数。请通过以下步骤配置访问鉴权,从而降低函数调用的风险。
    1. 在已创建函数的触发器管理中开启认证功能。具体操作,请参见触发器管理
    2. 访问触发器函数。
      • 通过默认域名访问触发器函数

        以下以Python SDK通过默认域名调用触发器函数为例,其他语言访问触发器函数的示例,请参见使用SDK执行HTTP触发器函数

        import fc2
        client = fc2.Client(
            endpoint='http://13**.cn-shanghai.fc.aliyuncs.com',
            # 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
            accessKeyID = 'yourAccessKeyId',
            accessKeySecret = 'yourAccessKeySecret'
        
        params = {
            'offset': '0',
            'includefield': 'all',
            'limit': '21',
        }
        
        req = client.do_http_request( "GET", "dicom.LATEST", "do", "dcm4chee-arc/aets/DCM4CHEE/rs/patients", headers={}, params=params)
        print (req)
      • 通过自定义域名访问触发器函数
        # -*- coding: utf-8 -*-
        import requests
        import fc2
        import email
        
        fc_host = 'http://www.dicomweb-***.com'
        fc_path = '/dcm4chee-arc/aets/DCM4CHEE/rs/studies'
        
        client = fc2.Client(
            endpoint='http://13**.cn-shanghai.fc.aliyuncs.com',
            # 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
            accessKeyID = 'yourAccessKeyId',
            accessKeySecret = 'yourAccessKeySecret'
        
        headers = {
            'date': email.utils.formatdate(usegmt=True),
            'content-type': 'application/json',
            'content-length': '0',
        }
        
        params = {
            'offset': '0',
            'includefield': 'all',
            'limit': '21',
        }
        headers['authorization'] = client.auth.sign_request("GET", fc_path, headers, unescaped_queries=params)
        response = requests.get(fc_host + fc_path, headers=headers, params=params)
        print (response)