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


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

相关文章推荐

WPF的TextBox抛出InvalidOperationException异常:Cannot close undo unit because no opened unit exists.

最近遇到一个问题,应用使用过程中突然崩溃,查看dump发现异常信息如下:UI dispatcher has encountered a problem:无法关闭撤消单元,因为不存在已打开的单元。在  ...

使用Spire组件抛出异常The type initializer for 'spr857' threw an exception

使用Spire组件抛出异常The type initializer for 'spr857' threw an exception   我使用免费的Spire.Xls组件尝试去转换Exce...

HttpClient连接池抛出大量ConnectionPoolTimeoutException: Timeout waiting for connection异常排查

今天解决了一个HttpClient的异常,汗啊,一个HttpClient使用稍有不慎都会是毁灭级别的啊。这里有之前因为route配置不当导致服务器异常的一个处理:http://blog.csdn.ne...

DICOM:fo-dicom之C-STORE再分析‘解决System.ObjectDisposedException异常’

背景:此次通过剖析DicomClient类中的AddRequest和Send源代码,以及DicomServiceUser服务的具体逻辑,结合C-STORE服务的具体应用场景对fo-dicom库中的C-...

java异常抛出

  • 2015-12-01 17:16
  • 981B
  • 下载

异常备忘:No WebApplicationContext found: no ContextLoaderListener registered

此问题产生的原因是因他的资源文件没加载进来所以找不到文件引起,于是我在web.xml中加入了如下语句:  Spring ApplicationContext配置文件的路径,可使用通配符,多个...

java throw抛出异常实例二

  • 2010-06-18 16:32
  • 59KB
  • 下载

抛出异常代码示例

  • 2015-05-09 14:40
  • 140B
  • 下载

日积(Running)月累(ZSSURE):Task之Cancel、OpenAccess之Delete及fo-dicom之DeepCopy、

题记:近期看了一篇关于架构方面的良心长文你的架构是如何一步步腐化的?,文中字字句句道出了诸多从业者、初创企业,以及BAT都会遇到的问题,细细品读后觉得工作生活中的诸多情况皆如此,都会有一个体量由小到大...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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