Frage

Ich habe eine OCR-Wrapper-Bibliothek rund um das Microsoft Office Document Imaging COM API geschrieben und in einer Konsole App lokal ausgeführt, es funktioniert einwandfrei, mit jedem Test.

Leider beginnen geht es schlecht, wenn wir versuchen, sie zu integrieren mit einem WCF-Dienst ausgeführt als ASP.Net Web Application unter IIS6. Wir hatten Probleme herum und versuchte, die MODI COM-Objekte, freizugeben und es gab viele Beispiele im Web, die uns geholfen haben.

Allerdings bleiben noch Probleme. Wenn ich IIS neu starten und arbeiten einen neuen Einsatz des Web-App, die ersten paar OCR Versuche groß. Wenn ich es für 30 Minuten verlassen oder so, und dann eine weitere Anforderung tun, bekomme ich Fehler Serverfehler wie folgt aus:

  

Der Server hat eine Ausnahme. (Ausnahme von HRESULT: 0x80010105 (RPC_E_SERVERFAULT)): bei MODI.DocumentClass.Create (String Fileopen)

Von diesem Punkt an wird nicht jede Anfrage die OCR zu tun, bis ich IIS zurückgesetzt, und der Zyklus beginnt erneut.

Wir führen diese Anwendung in einem eigenen App-Pool, und es läuft unter einer Identität mit Local Admin Rechten.

UPDATE: kann dieses Problem, indem Sie das OCR-Zeug aus Prozess gelöst werden. Es scheint, als ob die MODI Bibliothek nicht gut mit verwalteten Code spielt, wenn es nach mir selbst zu reinigen kommt, so neue Prozesse für jede OCR Anfrage Laichen funktionierte gut in meiner Situation.

Dies ist die Funktion, dass die OCR führt:

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

ich dann eine Instanz von Imagereader in einem mit Block instanziiert (die IDisposable.Dispose an der Ausfahrt nennen)

Beim Marshal.FinalReleaseComObject die CLR anweisen sollte die COM-Objekte freizugeben, und so ich ratlos bin, um herauszufinden, was die Symptome würden verursachen wir haben.

Für das, was es wert ist, diesen Code außerhalb von IIS ausgeführt wird, in einer Konsole App sagen, alles scheint kugelsicher. Es funktioniert jedes Mal.

Alle Tipps, die helfen, mir zu diagnostizieren und um dieses Problem zu lösen wäre eine enorme Hilfe sein, und ich werde wie verrückt upvote! ; -)

Danke!

War es hilfreich?

Lösung

Haben Sie daran gedacht, den OCR-Teil Ihrer App Hosting out-of-process .

ein Service kann Ihnen Tonnen Flexibilität geben:

  1. Sie können einen einfachen Endpunkt für Ihre Web-Anwendung definieren, und greifen Sie über Remoting oder WCF.
  2. Wenn Sachen Birnenform ist und die Bibliothek ist alles ausweichen, können Sie den Dienst starten Sie einen separaten Prozess jedes Mal, wenn Sie benötigen OCR ausführen müssen. Dies gibt Ihnen extreme Sicherheit, sondern beinhaltet ein klein zusätzliche Kosten. Ich würde davon ausgehen, dass OCR ist viel teurer als ein Prozess hochgefahren .
  3. Sie können eine Instanz halten um des COM-Objekts, wenn der Speicher beginnt undicht Sie sich ohne Auswirkungen auf die Website neu starten können (wenn Sie vorsichtig sind).

Persönlich habe ich in der Vergangenheit des COM-Interop + IIS = Trauer gefunden.

Andere Tipps

MODI ist unglaublich wackelig, wenn es um das Loswerden von selbst kommt, besonders in IIS ausgeführt wird. Nach meiner Erfahrung habe ich festgestellt, dass es zwar verlangsamt alles auf, die einzige Möglichkeit, diese Fehler loszuwerden, ist ein GC.WaitForPendingFinalizers () nach dem GC.Collect () Aufruf hinzuzufügen. Wenn Sie interessiert sind, dann schrieb ich einen Artikel darüber.

Können Sie das Problem in einer kleinen Konsolenanwendung replizieren? Vielleicht lassen sie schlafen für 30 Minuten und kommen zurück, um es?

Der beste Weg, Dinge wie diese zu lösen, ist es zu isolieren vollständig nach unten. Ich würde mich interessieren zu sehen, wie das funktioniert.

Ich musste viel mit diesem Fehler vor einer Woche, und nach ein paar Lösungen zu testen geben hier habe ich endlich das Problem behoben. Ich werde hier erklären, wie ich es tat.

In meinem Fall habe ich ein Windows-Dienst runing und Verarbeitung von Dokumenten aus einem Ordner, das Problem tritt auf, wenn mehr als 20 Dokumente sind, werfen den Fehler: Ausnahme von HRESULT:. 0x80010105 (RPC_E_SERVERFAULT)

In meinem Code i wurde ein Verfahren jedes Mal aufrufen i ein Dokument im Ordner erkennen, ich mache eine Instanz von MODI Dokument (MODI.Document _document = new MODI.Document ();) und ich verarbeiten die Datei, und dass war, was den Fehler !!

Ursachen

Die Lösung war nur eine globale Instanz von MODI.Document zu haben, und alle Dokumente verarbeiten Whit es, auf diese Weise habe ich nur eine Instanz für meinen Dienst alle Zeit runing.

ich hoffe, das wird denen helfen, die das gleiche Problem konfrontiert sind.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top