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

背景: 在做一个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()) { 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");


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部