AspNet WebApi 中应用fo-dicom抛出异常:No codec registered for tranfer syntax:
来源:互联网 发布:电气专业单词软件下载 编辑:程序博客网 时间:2024/06/06 00:44
背景:
在做一个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
- AspNet WebApi 中应用fo-dicom抛出异常:No codec registered for tranfer syntax:
- 在AspNet.WebApi中使用Razor
- no [query] registered for [filtered]
- DICOM:fo-dicom之C-STORE再分析‘解决System.ObjectDisposedException异常’
- No WebApplicationContext found: no ContextLoaderListener registered异常
- Temporary solution: LookupError: no codec search functions registered
- DICOM:再次剖析fo-dicom中DicomService的自定义事件绑定
- No checks registered for this product
- EventBus : No subscribers registered for event class
- No subscribers registered for event class
- JNI中抛出异常
- 程序中抛出异常
- JNI中抛出异常
- 抛出异常 For input string: ""
- jpa查询blob数据抛出异常:No Dialect mapping for JDBC type -4
- DICOM:基于fo-dicom的简易DICOM Viewer
- DICOM:DICOM开源库多线程分析之“ThreadPoolQueue in fo-dicom”
- 异常备忘:No WebApplicationContext found: no ContextLoaderListener registered
- 【spring源码分析】--Bean的解析与注册
- 习题20150611.4
- mybatis最好用的分页插件
- 二分查找算法
- Android控件之ViewStub的使用技巧
- AspNet WebApi 中应用fo-dicom抛出异常:No codec registered for tranfer syntax:
- 数据库性能优化二:数据库表优化
- PSSM特征-从生成到处理
- Android TextView内容过长加省略号
- Java&Scala混合编程
- Qt中main函数详解
- 【Hdu】1080 Human Gene Functions
- 数据库性能优化三:程序操作优化
- DicomIoException: Requested 132 bytes past end of fixed length stream.