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

标签: fo-dicomwebapitransfersyntaxdicom
1281人阅读 评论(0) 收藏 举报
分类:
背景:
在做一个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");


1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:630538次
    • 积分:8238
    • 等级:
    • 排名:第2412名
    • 原创:245篇
    • 转载:1篇
    • 译文:1篇
    • 评论:258条
    微信公众号:WPF编程之路
    博客专栏
    最新评论