문제

Microsoft Office 문서 이미징 COM API 주위에 OCR 래퍼 라이브러리를 작성했으며 로컬로 실행되는 콘솔 앱에서는 모든 테스트마다 완벽하게 작동합니다.

안타깝게도 IIS6 하에서 ASP.NET 웹 응용 프로그램으로 실행되는 WCF 서비스와 통합하려고 할 때 상황이 나빠지기 시작합니다. 우리는 Modi Com 객체를 자유롭게하려고 노력하는 데 문제가 있었고 웹에는 우리를 도와주는 많은 예가있었습니다.

그러나 여전히 문제는 여전히 남아 있습니다. IIS를 다시 시작하고 웹 앱을 새로 배포하면 처음 몇 번의 OCR 시도가 잘 작동합니다. 30 분 정도 남겨두면 다른 요청을 수행하면 다음과 같은 서버 실패 오류가 발생합니다.

서버는 예외를 던졌습니다. (hresult의 예외 : 0x80010105 (rpc_e_serverfault)) : at modi.documentclass.create (String fileOpen)

이 시점부터 IIS를 재설정 할 때까지 모든 요청이 OCR을 수행하지 못하고 사이클이 다시 시작됩니다.

우리는이 응용 프로그램을 자체 앱 풀에서 실행하며 로컬 관리자 권한으로 신원을 유지합니다.

업데이트 :이 문제는 OCR 작업을 수행하여 해결할 수 있습니다. 마치 Modi 라이브러리가 관리 코드에서 잘 작동하지 않는 것처럼 보입니다. 자체적으로 청소할 때 각 OCR 요청에 대한 새로운 프로세스가 제 상황에서 잘 작동했습니다.

다음은 OCR을 수행하는 기능입니다.

    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();
    }
}

그런 다음 사용 블록 내에서 이미지 드레더 인스턴스를 인스턴스화합니다 (idisposable.dispose에서 exit을 호출합니다).

Call.FinalReleasecomobject에게 CLR에게 COM 개체를 방출하도록 지시해야하므로 증상이 무엇을 일으킬지 알아 내지 못하고 있습니다.

가치가있는 것에 대해,이 코드를 IIS 외부에서 실행하고, 콘솔 앱에서는 모든 것이 방탄 증거로 보입니다. 그것은 매번 작동합니다.

이 문제를 진단하고 해결하는 데 도움이되는 모든 팁은 엄청난 도움이 될 것이며 미친 듯이 투표 할 것입니다! ;-)

감사!

도움이 되었습니까?

해결책

앱의 OCR 부분을 호스팅 할 생각이 있습니까? 프로세스 외.

서비스가 있으면 많은 유연성을 줄 수 있습니다.

  1. 웹 응용 프로그램의 간단한 엔드 포인트를 정의하고 원격 또는 WCF를 통해 액세스 할 수 있습니다.
  2. 물건이 배 모양이고 라이브러리가 모두 피하는 경우 OCR을 수행해야 할 때마다 서비스가 별도의 프로세스를 시작할 수 있습니다. 이것은 당신에게 극도의 안전을 제공하지만 작은 추가 비용을 포함합니다. 나는 그것을 가정 할 것이다 OCR은 프로세스를 회전하는 것보다 훨씬 비쌉니다..
  3. COM 객체 주위의 인스턴스를 유지할 수 있습니다. 메모리가 누출되기 시작하면 웹 사이트에 영향을 미치지 않고 자신을 다시 시작할 수 있습니다 (조심 한 경우).

개인적으로 나는 과거에 com interop + iis = 슬픔을 발견했습니다.

다른 팁

Modi는 스스로를 제거하고, 특히 IIS에서 뛰는 데있어 엄청나게 원조합니다. 내 경험에 따르면, 나는 그것이 모든 것을 늦추지 만, 이러한 오류를 제거하는 유일한 방법은 gc.collect () 호출 후 GC.waitforPendingFinalizers ()를 추가하는 것입니다. 관심이 있으시면 나는 썼다 기사 이것에 관해서.

소규모 콘솔 응용 프로그램에서 문제를 복제 할 수 있습니까? 아마도 30 분 동안 잠을 자고 돌아 오는가?

이와 같은 것을 해결하는 가장 좋은 방법은 그것을 완전히 격리시키는 것입니다. 나는 그것이 어떻게 작동하는지보고 싶을 것이다.

나는 일주일 전에이 오류를 처리해야했고, 여기에서 제공하는 솔루션을 테스트 한 후 마침내 문제를 해결했습니다. 여기서 어떻게했는지 설명하겠습니다.

내 경우에는 폴더에서 Windows 서비스가 실행되고 처리되는 문서가 있습니다. 문제는 20 개가 넘는 문서가있을 때 발생합니다. 오류 : Hresult : 0x80010105 (rpc_e_serverfault)의 예외를 던집니다.

내 코드에서 나는 폴더에서 문서를 감지 할 때마다 메소드를 호출하고 있었는데, modi 문서의 인스턴스 (modi.document _document = new modi.document ();)를 처리하고 파일을 처리합니다. 이것이 원인이었습니다. 오류!!

해결책은 하나의 전역 인스턴스 인 Modi.document 인스턴스를 갖고 모든 문서를 처리하는 것이 었습니다.

나는 그것이 같은 문제에 직면하는 사람들에게 도움이되기를 바랍니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top