OHIF DICOMweb Proxy 数据源:基于 JSON 配置的动态 DICOMweb 代理接入指南
OHIF DICOMweb Proxy 数据源基于 JSON 配置的动态 DICOMweb 代理接入指南【免费下载链接】ViewersOHIF zero-footprint DICOM viewer and oncology specific Lesion Tracker, plus shared extension packages项目地址: https://gitcode.com/GitHub_Trending/vi/Viewers在 OHIF Viewer 中DICOMweb Proxy 是一种特殊的动态数据源只需提供一个返回 JSON 配置文件的外部 URLOHIF 便会读取其中的 DICOMweb 服务配置动态构造一个完整的 DICOMweb 数据源并把后续的元数据查询、影像检索与存储请求全部委托给该服务。本文以仓库中的配置文档为主线结合extensions/default扩展的源码实现讲解其工作原理、JSON 配置结构、URL 调用方式与安全边界帮助你在不修改前端代码的前提下将 OHIF Viewer 动态接入任意 DICOMweb 服务。什么是 DICOMweb ProxyDICOMweb Proxy 是ohif/extension-default扩展注册的webApi类型数据源其核心思路是配置不写死在应用里而是通过 URL 动态下发。你可以用一个带有dicomwebproxy路径的 URL 启动 OHIF Viewer该 URL 的查询参数指向一份返回 JSON 的远程地址JSON 中含有一个 DICOMweb 配置。OHIF 解析该配置后构造 DICOMweb 数据源并委托后续的元数据与影像请求到配置中指定的服务器https://viewer.ohif.org/viewer/dicomwebproxy?urlhttps://ohif-dicom-json-example.s3.amazonaws.com/dicomweb.json其中url查询参数的值即 JSON 文件所在位置例如上例中的https://ohif-dicom-json-example.s3.amazonaws.com/dicomweb.json该文件在编写本文档时并不存在仅作示例。文档中特别指出DICOMweb Proxy 的使用方式与 DICOM JSON 数据源 十分相似——两者都是通过?url动态加载配置区别在于 DICOM JSON 加载的是静态 JSON 元数据而 DICOMweb Proxy 加载的是 DICOMweb 服务配置随后与真实服务器进行 DICOMweb 协议交互。JSON 配置结构servers.dicomWeb 数组url参数返回的 JSON 中必须包含一个servers对象其下有一个名为dicomWeb的配置数组。DICOMweb Proxy 只取数组的第一项来构造数据源多出的项会被忽略。下面是最小可用的示例配置完整来自 关联文档{ servers: { dicomWeb: [ { name: DCM4CHEE, wadoUriRoot: https://server.dcmjs.org/dcm4chee-arc/aets/DCM4CHEE/wado, qidoRoot: https://server.dcmjs.org/dcm4chee-arc/aets/DCM4CHEE/rs, wadoRoot: https://server.dcmjs.org/dcm4chee-arc/aets/DCM4CHEE/rs, qidoSupportsIncludeField: true, supportsReject: true, imageRendering: wadors, thumbnailRendering: wadors, enableStudyLazyLoad: true, supportsFuzzyMatching: true, supportsWildcard: true } ] } }各字段含义与作用字段说明name数据源展示名称例如DCM4CHEE用于标识后端归档wadoUriRootWADO-URI 请求的根地址对应/wado端点qidoRootQIDO-RS 查询服务的根地址对应/rs端点wadoRootWADO-RS 检索服务的根地址对应/rs端点qidoSupportsIncludeField服务端 QIDO 是否支持includefield查询参数supportsReject服务端是否支持 reject 操作imageRendering影像渲染方式常用wadorsthumbnailRendering缩略图渲染方式常用wadorsenableStudyLazyLoad是否启用 study 级懒加载supportsFuzzyMatching是否支持模糊匹配查询supportsWildcard是否支持通配符查询提示qidoRoot、wadoRoot与可选的stowRoot是相互独立的绝对 URL不必共享同一主机或路径前缀——QIDO、WADO、STOW 三类服务可分别路由到各自的根地址。此外由于 DICOMweb Proxy 最终把配置委托给 DICOMweb 数据源处理DICOMweb 数据源 文档中介绍的全部配置选项如singlepart、thumbnailRendering、thumbnailRequestStrategy、queryLimit、bulkDataURI、dicomUploadEnabled等同样适用于 JSON 中的服务器配置可在远程 JSON 中直接使用。例如{ servers: { dicomWeb: [ { name: Orthanc, qidoRoot: https://pacs.example.org/dicom-web, wadoRoot: https://pacs.example.org/dicom-web, imageRendering: wadors, thumbnailRendering: rendered, thumbnailRequestStrategy: fetch, queryLimit: 101, bulkDataURI: { enabled: true, relativeResolution: series } } ] } }源码实现如何动态构造 DICOMweb 数据源DICOMweb Proxy 的核心实现位于 extensions/default/src/DicomWebProxyDataSource/index.ts它在数据源注册模块 getDataSourcesModule.js 中以dicomwebproxy名称注册type为webApi。初始化流程initialize是动态代理的关键入口其工作流程为读取 URL从查询参数中读取url若缺失则抛出No url for name错误安全校验调用resolveConfigFetchPolicy(url, ...)校验目标 URL 的协议、同源关系与来源白名单详见下文“安全边界”拉取 JSON通过fetchConfigJson以 CORS 方式 GET 远程 JSON结构校验若返回的数据中缺少data.servers?.dicomWeb?.[0]抛出Invalid configuration returned by url委托构造以data.servers.dicomWeb[0].configuration || data.servers.dicomWeb[0]为配置调用 DICOMweb 数据源的createDicomWebApi构造委托数据源随后调用其initialize。注意第 5 步的兼容逻辑如果数组第一项内部存在configuration子对象则以子对象为准否则直接使用该项本身——这允许远程 JSON 在服务信息外层再包一层configuration。委托的接口面构造完成后代理对象把 DICOMweb 数据源的接口逐项转发形成完整的IWebApiDataSource实现query.studies.search/query.series.search/query.instances.search研究、序列、实例三级查询retrieve.getGetThumbnailSrc/retrieve.directURL/retrieve.renderedURL缩略图与影像直链/渲染 URLretrieve.series.metadata序列元数据检索store.dicomDICOM 存储STOW-RSreject.series、deleteStudyMetadataPromise、getImageIdsForDisplaySet、getImageIdsForInstance、getConfig其余委托能力。getConfig在委托尚未建立时返回{ dicomUploadEnabled: false }作为安全默认值。另外getStudyInstanceUIDs直接从查询参数读取studyInstanceUIDs兼容studyInstanceUids的大小写变体以分号;分隔解析为数组——这一逻辑与模式路由中按数据源路径进入工作区的机制配合用于指定要加载的研究列表。URL 查询参数读取从源码可见初始化时通过query.get(url)读取配置地址。也就是说完整的调用形态为在/viewer/dicomwebproxy路径后携带?urljson地址查询参数如文档开头的示例所示。在应用配置中启用 dicomwebproxyDICOMweb Proxy 需要在应用的dataSources数组中注册才会生效。参考开发环境配置 platform/app/public/config/dev.js{ namespace: ohif/extension-default.dataSourcesModule.dicomwebproxy, sourceName: dicomwebproxy, configuration: { friendlyName: dicomweb delegating proxy, name: dicomwebproxy, }, },namespace指向扩展注册的数据源模块标识sourceName为数据源名称模式路由通过/mode/dicomwebproxy这类路径定位到该数据源configuration.name用于初始化错误信息中的数据源标识configuration.friendlyName为界面展示名称。值得注意的是默认生产配置 platform/app/public/config/default.js 中刻意不启用dicomwebproxy以及dicomlocal、dicomjson等动态源并注释说明?url类运行时源会扩大默认部署的攻击面应在受控的部署环境中按需开启。KHEOPS 等特定部署也会在自己的配置如 kheops.js中注册该数据源并通过 OHIF 路径对接/viewer/dicomwebproxy。安全边界authenticated 环境下的来源白名单DICOMweb Proxy 通过 secureConfigFetch.js 中的resolveConfigFetchPolicy实施严格的 URL 校验协议限制仅允许http:与https:其他协议直接拒绝禁止片段与用户信息URL 中不得包含#片段也不得携带username:password用户信息同源放行若配置 URL 与应用同源直接放行已认证环境的白名单当存在已登录的userAuthenticationService即携带 Authorization 头且配置 URL 非同源时必须命中dangerouslyAllowedOriginsForAuthenticatedEnvironments配置的白名单裸源格式scheme host 可选端口不允许带路径、查询、hash 或用户信息否则抛出Blocked remote configuration origin ...错误。fetchConfigJson以mode: cors、credentials: same-origin、redirect: error、referrerPolicy: no-referrer发起 GET 请求响应非 2xx 时抛出带状态码的错误。该安全策略在 secureConfigFetch.test.js 中有对应测试覆盖。在 DICOMweb Proxy 数据源中白名单通过数据源配置的dangerouslyAllowedOriginsForAuthenticatedEnvironments传入{ namespace: ohif/extension-default.dataSourcesModule.dicomwebproxy, sourceName: dicomwebproxy, configuration: { name: dicomwebproxy, friendlyName: dicomweb delegating proxy, dangerouslyAllowedOriginsForAuthenticatedEnvironments: [ https://config.example.org, ], }, },从字段名中的dangerously可以推断这是为受信任环境准备的配置用于在已认证携带凭证的前提下允许跨源加载动态数据源配置需要部署者仔细权衡安全影响。典型使用场景与注意事项适用场景多租户 / 多归档接入同一套 OHIF 前端根据 URL 参数动态切换不同的 DICOMweb 后端如 DCM4CHEE、Orthanc 等无需重新构建应用配置下发与运维解耦服务端可随时更新 JSON 配置如切换服务器地址、调整supportsWildcard等能力开关前端无需发版托管平台集成外部平台如 KHEOPS在自己的服务端维护配置通过/viewer/dicomwebproxy?url...将患者数据路由到对应归档。注意事项JSON 配置必须包含servers.dicomWeb数组且非空否则数据源初始化会直接报错只使用数组第一项多余配置不会生效代理委托的是 DICOMweb 数据源因此 DICOMweb 配置文档 中关于服务端能力supportsReject、supportsFuzzyMatching、supportsWildcard、qidoSupportsIncludeField、bulkDataURI相对路径解析relativeResolution: studies | series等的说明同样适用生产环境默认不启用该数据源需在受控部署中显式注册并结合dangerouslyAllowedOriginsForAuthenticatedEnvironments白名单约束跨源加载。总结DICOMweb Proxy 为 OHIF Viewer 提供了一种“配置即 URL”的动态接入能力前端通过?url参数获取远端 JSON动态构造 DICOMweb 数据源并委托全部后续请求。其实现集中在 DicomWebProxyDataSource/index.ts配合 secureConfigFetch.js 的协议校验与认证环境白名单机制兼顾了灵活性与安全性。对于需要多归档接入、配置热更新或平台托管集成的场景DICOMweb Proxy 是与 DICOM JSON 数据源互补的重要方案。【免费下载链接】ViewersOHIF zero-footprint DICOM viewer and oncology specific Lesion Tracker, plus shared extension packages项目地址: https://gitcode.com/GitHub_Trending/vi/Viewers创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

Flutter与鸿蒙开发健身应用实战指南

Flutter与鸿蒙开发健身应用实战指南

1. 项目背景与核心价值作为一名长期混迹移动开发圈的老兵,我见证过太多跨平台方案的起起落落。当鸿蒙系统横空出世时,整个行业都在思考:如何用最小成本将现有技术栈迁移到这个新兴平台?经过半年多的实战验证,我发现Flu…

2026/9/18 8:05:20 阅读更多 →
background-agents队列路由与后台任务机制全解析:新手也能看懂的完整指南

background-agents队列路由与后台任务机制全解析:新手也能看懂的完整指南

background-agents队列路由与后台任务机制全解析:新手也能看懂的完整指南 【免费下载链接】background-agents An open-source background agents coding system 项目地址: https://gitcode.com/GitHub_Trending/ba/background-agents background-agents&…

2026/9/18 8:05:20 阅读更多 →
工科毕业论文中3D打印应用的实证方法论

工科毕业论文中3D打印应用的实证方法论

简介:本资源是一份面向高校机械、材料、生物医学工程等专业本科生的3D打印技术应用类毕业论文正稿,聚焦技术原理与跨领域实践价值,助力学生完成高质量学术写作与工程认知拓展。全文共11页,结构完整,涵盖引言、3D打印工…

2026/9/18 8:05:20 阅读更多 →

最新新闻

16 类 Adobe 软件替代方案:200 余款工具按场景选型

16 类 Adobe 软件替代方案:200 余款工具按场景选型

16 类 Adobe 软件替代方案:200 余款工具按场景选型 【免费下载链接】Adobe-Alternatives A list of alternatives for Adobe software 项目地址: https://gitcode.com/GitHub_Trending/ad/Adobe-Alternatives Adobe-Alternatives 是社区维护的 Adobe 替代方案…

2026/9/18 8:47:40 阅读更多 →
数据分析和画图本来是一件事:图分三档用,分析才推得动

数据分析和画图本来是一件事:图分三档用,分析才推得动

一边跑分析一边要出图,这两条线怎么并着往前走?图常被拖到章节交稿才补。图本来就分三档:自己看形状的、并排对读数的、留进章节的;认出手上这一张属于哪档,两条线才推得动。写论文时有两件事免费用得上:一…

2026/9/18 8:47:40 阅读更多 →
VoiceStudio语音工作台:批量合成与稳定流水线实践

VoiceStudio语音工作台:批量合成与稳定流水线实践

做语音内容这几年,我最怕的不是没灵感,而是素材散。一段三分钟的旁白,可能要经历录音笔采集、Audacity粗剪、某在线工具降噪、另一个网页端做合成补录、最后再导回剪辑软件对齐时间轴。中间任何一个环节换台机器、换个浏览器,参数…

2026/9/18 8:47:40 阅读更多 →
OpenHarmony与Flutter颜色格式转换实战

OpenHarmony与Flutter颜色格式转换实战

1. 项目背景与核心价值在OpenHarmony应用开发中,颜色处理是一个高频需求场景。无论是UI主题定制、动态换肤功能,还是可视化图表绘制,开发者都需要在不同颜色表示格式之间进行转换。Flutter作为跨平台开发框架,其颜色处理能力与Ope…

2026/9/18 8:47:40 阅读更多 →
CoAI.Dev AI聚合聊天平台自托管指南:200+大模型与计费系统装进一个站点

CoAI.Dev AI聚合聊天平台自托管指南:200+大模型与计费系统装进一个站点

CoAI.Dev AI聚合聊天平台自托管指南:200大模型与计费系统装进一个站点 【免费下载链接】chatnio 🚀 Next Gen Multi-tenant AI One-Stop Solution. Builtin Admin & Billing System. Enterprise-Grade Unified LLM Gateway Support for 200 Models A…

2026/9/18 8:47:40 阅读更多 →
STM32上电启动全过程:从复位向量到main执行的硬核解析

STM32上电启动全过程:从复位向量到main执行的硬核解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/18 8:46:40 阅读更多 →

日新闻

Matlab手写逻辑回归:从数学原理到多变量概率预测模型实现

Matlab手写逻辑回归:从数学原理到多变量概率预测模型实现

很多朋友第一次看到"逻辑回归"这四个字,第一反应就是——这玩意儿是个回归模型吧?我当年也是在Matlab里跑完一段代码,看着输出的0.73、0.86这种概率值,才回过神来:这家伙其实是披着回归外衣的分类神器&#…

2026/9/18 0:00:28 阅读更多 →
高值医用耗材研报PDF:用Python完成字段抽取、清洗与趋势预测

高值医用耗材研报PDF:用Python完成字段抽取、清洗与趋势预测

简介:这份报告是2023-2028年高值医用耗材行业调研及发展前景趋势预测报告,面向医疗器械企业管理者、投资机构、行业研究人员及关注政策变化的从业者,用于把握行业监管动向、市场格局与未来趋势。报告以PDF格式呈现,共1个文件、整体…

2026/9/18 0:00:28 阅读更多 →
三维高斯场赋能世界模型:几何语义蒸馏与机器人决策实战

三维高斯场赋能世界模型:几何语义蒸馏与机器人决策实战

先把我自己的背景交代一下:我之前在搞具身智能和机器人导航相关的项目,很长一段时间里都被“环境表示”这件事卡着。传统做法是用点云或者网格做几何建模,语义信息另外再跑分割模型,两套东西各管各的,时间一长就会发现…

2026/9/18 0:00:28 阅读更多 →

周新闻

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验 【免费下载链接】ai The AI Toolkit for TypeScript. From the creators of Next.js, the AI SDK is a free open-source library for building AI-powered applications and ag…

2026/9/16 19:03:19 阅读更多 →
Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化

Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化

Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化 【免费下载链接】refine A React Framework for building internal tools, admin panels, dashboards & B2B apps with unmatched flexibility. 项目地址: https://gitcode.com/GitH…

2026/9/17 7:57:36 阅读更多 →
Flutter应用改名全指南:从Android到iOS的配置与工具实践

Flutter应用改名全指南:从Android到iOS的配置与工具实践

刚接一个外包项目时,甲方要求把工程里临时用的应用名改成正式产品名。我本来觉得“改名”这种小事,打开配置文件改一行不就完了?结果真动手才发现,Flutter项目里“应用名称”根本不是一处配置,而是一整套散落在 Androi…

2026/9/17 10:19:14 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/16 22:31:27 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/15 21:39:18 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/16 22:32:59 阅读更多 →