背景:
在做一個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");
- 前言
- HL7 Tools suite
- HL7 Event Type
- HL7 ADT Message Sample
- IHE-PIX 備注
- HL7 V2 分隔符
- 有關HL7 的C# 源碼
- Pix mesa 自動化測試
- hl7 V2中Message Control ID的含義及應用
- hl7消息中和時間有關的字段的格式
- hl7中V2版本的ACK消息的構造
- hl7 v2.X 版本中RSP_K23消息的構造
- HL7及PIX相關的測試工具
- HL7 標準及實現指南 必看的網址
- IHE 官方網址有用資源介紹
- PIX v2版本中Query 失敗時, ERR段的構造
- AspNet WebApi 中應用fo-dicom拋出異常:No codec registered for tranfer syntax:
- DicomIoException: Requested 132 bytes past end of fixed length stream.
