AspNet WebApi 中应用fo-dicom抛出异常:No codec registered for tranfer syntax:

原创 2015年07月07日 22:34:27
背景:
在做一个Dicom Web Service, 其中WADO-RS中需要解析TransferSyntax, 然后就用到了fo-dicom中的DicomFile.ChangeTransferSyntax方法。
代码类似:
  var df = DicomFile.Open(samplesDir + @"\User Submitted\overlays.dcm");
                df = df.ChangeTransferSyntax(DicomTransferSyntax.JPEG2000Lossless);

问题:
就是上述代码在Console(exe)中运行正常, 在WebApi服务中则抛出异常:No codec registered for tranfer syntax:

原因:
查看fo-dicom源码后, 发现DicomCodec是在DicomTranscoder的静态构造方法里用MEF初始化的。
代码类似:
 static DicomTranscoder()
        {
            LoadCodecs(null, "Dicom.Native*.dll");
        }

 public static void LoadCodecs(string path = null, string search = null)
        {
            if (path == null)
            {
                path = Path.GetDirectoryName(new Uri(Assembly.GetExecutingAssembly().CodeBase).LocalPath);
            }

            var log = LogManager.Default.GetLogger("Dicom.Imaging.Codec");

            var catalog = ( search == null )
                ? new DirectoryCatalog(path)
                : new DirectoryCatalog(path, search);
            var container = new CompositionContainer(catalog);
            foreach (var lazy in container.GetExports<IDicomCodec>())
            {
                var codec = lazy.Value;
                log.Debug("Codec: {0}", codec.TransferSyntax.UID.Name);
                _codecs[codec.TransferSyntax] = codec;
            }
        }

当为Console时,上述path就是exe所在的路径,因此MEF的机制可以找到Dicom.Native.DLL,然后就可以取到Codecs。

当为AspNet WebApi时,上述path是C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\root\e298f90d\bf8a423a
\assembly\dl3\2196513d\b06fccd3_417bd001,每个DLL都在独立的路径下, 导致在WebApi的dll的路径找不到Dicom.Native.DLL,因此就取不到Codecs,从而抛出异常No codec registered for tranfer syntax:

解决办法:
在WebApiConfig.Register方法中添加如下代码:
 var path = Path.GetDirectoryName(new Uri(Assembly.GetExecutingAssembly().CodeBase).LocalPath);
            Dicom.Imaging.Codec.DicomTranscoder.LoadCodecs(path, "Dicom.Native*.dll");


版权声明:本文为博主原创文章,欢迎转载,仅请署名

DICOM医学图像处理:开源库mDCM与DCMTK的比较分析(一),JPEG无损压缩DCM图像(续)

背景: 上周通过单步调试,找出了开源库mDCM与DCMTK在对DICOM图像进行JPEG无损压缩时的细小区别,并顺利实现了在C++和C#环境下对DICOM图像的压缩。但是问题接踵而至啊,随着项目的深入...
  • zssureqh
  • zssureqh
  • 2014年08月17日 21:24
  • 4989

自己用C++实现BaseLine Jpeg解码(要点总结)

忙活这几天,终于自己用C++完整实现了BaseLine的Jpeg解码算法,中间阅读了一些论文和网上的帖子,发现其中有很多没有说清楚的地方,自己在实现的过程中也受到网上资料的很多误导,现在自己完整地把J...
  • xiaohaowudi
  • xiaohaowudi
  • 2014年02月11日 00:04
  • 1331

KS 工作记录

EMMC DDR LCD LVDS LDB FLASH UBOOT V4L2 CALL FLOW TS CAMERA ANDROID MARKDONW KGDB QEMU KER...
  • M_O_Bz
  • M_O_Bz
  • 2016年10月28日 14:29
  • 1099

微信小程序侧边栏+语音记账本(主页面)

微信小程序侧边栏+语音记账本
  • weixin_36065510
  • weixin_36065510
  • 2017年05月22日 23:34
  • 1983

调试经验--使用TI提供的jpeg解码codec

codec engine机制可以让我们方便的实现在arm端调用dsp端的算法。TI免费提供了几种dsp上运行的编解码codec,可以在TI的网站上下载。 网址如下: http://software-d...
  • lintax
  • lintax
  • 2014年03月08日 17:33
  • 1714

什么是基线(Baseline)?

什么是基线(Baseline)?        基线是软件文档或源码(或其它产出物)的一个稳定版本,它是进一步开发的基础。所以,当基线形成后,项目负责SCM的人需要通...
  • meng0601
  • meng0601
  • 2016年10月24日 19:35
  • 443

Real-time Operation System Course: 解密字符串

#include #define N 8 void decode(char original_message[], char resulting_message[]){ int i, j,...
  • rlikai
  • rlikai
  • 2015年01月18日 08:56
  • 10184

牛逼的导航

It will be read and overwritten.      DO NOT EDIT! --> Bookmarks Bookmarks Menu     Recent...
  • HkEndless
  • HkEndless
  • 2011年12月27日 15:52
  • 6436

基于协同过滤,NMF和Baseline的推荐算法

老早就想整理一篇推荐算法的入门博文,今天抽空写一下。本文以电影推荐系统为例,简单地介绍基于协同过滤,PMF概率矩阵分解,NMF非负矩阵分解和Baseline的推荐系统算法。NMF的实现具体可以参考Re...
  • winone361
  • winone361
  • 2016年04月05日 04:59
  • 977

迁移学习(transfer learning)

读ICML2007的一篇文章:Boosting for Transfer Learning 2011年04月14日 ⁄ 科研⁄ 共 1302字 ⁄ 评论数 12 ⁄ 被围观 3,422+ ...
  • cj314583
  • cj314583
  • 2014年06月25日 20:52
  • 2268
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:AspNet WebApi 中应用fo-dicom抛出异常:No codec registered for tranfer syntax:
举报原因:
原因补充:

(最多只允许输入30个字)