私はMicrosoft Office Document Imaging COM APIの周囲にOCRラッパーライブラリを作成しました。ローカルで実行されるコンソールアプリケーションでは、すべてのテストで完璧に機能します。ASP.Net WebアプリケーションでMODIを使用するにはどうすればよいですか?
悲しいことに、私たちがIIS6でASP.Net Webアプリケーションとして実行しているWCFサービスと統合しようとすると、状況が悪くなり始めます。私たちはMODI COMオブジェクトを解放しようとすることに問題がありました。そして、私たちを助けた多くの例がウェブ上にありました。
しかし、まだ問題が残っています。 IISを再起動してWebアプリケーションを新しくデプロイすると、最初の数回のOCR試行がうまくいきます。 、私はIISをリセットするまで、すべての要求は、OCRを行うには失敗しますこの時点から
The server threw an exception. (Exception from HRESULT: 0x80010105 (RPC_E_SERVERFAULT)): at MODI.DocumentClass.Create(String FileOpen)
:私は30分ほど放置し、その後、別の要求を行う場合、私はこのようなサーバー障害エラーを取得しますサイクルが再び始まります。
このアプリケーションは独自のアプリケーションプールで実行され、ローカル管理者権限を持つIDで実行されます。
更新:この問題は、処理中のOCRの処理を行うことで解決できます。私の状況では、MODIライブラリが管理コードでうまく動かないように見えるので、OCRリクエストごとに新しいプロセスを生成することはうまくいった。私は、Marshal.FinalReleaseComObjectを呼び出す(終了時にIDisposable.Disposeを呼ぶ)を用いてブロック
内部するImageReaderのインスタンスをインスタンス
public class ImageReader : IDisposable
{
private MODI.Document _document;
private MODI.Images _images;
private MODI.Image _image;
private MODI.Layout _layout;
private ManualResetEvent _completedOCR = new ManualResetEvent(false);
// SNIP - Code removed for clarity
private string PerformMODI(string fileName)
{
_document = new MODI.Document();
_document.OnOCRProgress += new MODI._IDocumentEvents_OnOCRProgressEventHandler(_document_OnOCRProgress);
_document.Create(fileName);
_document.OCR(MODI.MiLANGUAGES.miLANG_ENGLISH, true, true);
_completedOCR.WaitOne(5000);
_document.Save();
_images = _document.Images;
_image = (MODI.Image)_images[0];
_layout = _image.Layout;
string text = _layout.Text;
_document.Close(false);
return text;
}
void _document_OnOCRProgress(int Progress, ref bool Cancel)
{
if (Progress == 100)
{
_completedOCR.Set();
}
}
private static void SetComObjectToNull(params object[] objects)
{
for (int i = 0; i < objects.Length; i++)
{
object o = objects[i];
if (o != null)
{
Marshal.FinalReleaseComObject(o);
o = null;
}
}
}
[MethodImpl(MethodImplOptions.NoInlining)]
public void Dispose()
{
SetComObjectToNull(_layout, _image, _images, _document);
GC.Collect();
GC.WaitForPendingFinalizers();
}
}
:ここ
はOCRを実行する関数でありますCOMオブジェクトを解放するようにCLRに指示する必要があります。そのため、私たちが持っている症状を引き起こす原因を突き止めることはできません。
IISの外でこのコードを実行する価値があるのは、コンソールアプリケーションでは、すべてが弾丸であるようです。毎回動作します。
私がこの問題を診断して解決するのに役立つヒントは、莫大な助けとなり、私は狂気のようにアップヴォートするでしょう! ;-)
ありがとう!
私に賞金を与えてくれてありがとう、それがあなたを助けてくれてうれしい! –