كيف يمكنني استخدام مودي في ASP.Net تطبيقات الويب ؟

StackOverflow https://stackoverflow.com/questions/1344510

  •  20-09-2019
  •  | 
  •  

سؤال

لقد كتب OCR المجمع مكتبة حول Microsoft Office Document Imaging COM API في وحدة التحكم التطبيق قيد التشغيل محليا ، فإنه يعمل لا تشوبه شائبة مع كل اختبار.

للأسف, تبدأ الأمور تسير بشكل سيء عندما نحاول دمجها مع خدمة WCF تعمل باعتبارها ASP.Net تطبيق ويب تحت IIS6.لدينا قضايا حول محاولة تحرير مودي كائنات COM, و هناك الكثير من الأمثلة على شبكة الإنترنت التي ساعدت الولايات المتحدة.

ومع ذلك ، لا تزال هناك مشاكل.إذا كنت إعادة تشغيل IIS و لا جديد نشر التطبيق على شبكة الإنترنت, القليلة الأولى OCR محاولات العمل العظيم.إذا كنت تترك لمدة 30 دقيقة أو نحو ذلك, ثم هل طلب آخر أنا على فشل الخادم أخطاء من هذا القبيل:

الخادم رمى استثناء.(استثناء من HRESULT:0x80010105 (RPC_E_SERVERFAULT)):في مودي.DocumentClass.إنشاء(سلسلة فوقfileopen)

من هذه النقطة على كل طلب سوف تفشل في القيام OCR, حتى أنا إعادة تعيين IIS ، وتبدأ الدورة مرة أخرى.

نحن تشغيل هذا التطبيق في نفسه تجمع التطبيق و تشغيله تحت هوية مع حقوق المسؤول المحلي.

تحديث:هذه المشكلة يمكن حلها عن طريق القيام 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();
    }
}

ثم إنشاء مثيل ImageReader داخل باستخدام كتلة (والتي سوف نداء IDisposable.التصرف على الخروج)

داعيا المشير.FinalReleaseComObject أن يأمر CLR للافراج عن كائنات COM, و لذلك أنا في حيرة لمعرفة ما يمكن أن يكون تسبب الأعراض لدينا.

ما يستحق ، تشغيل هذه التعليمات البرمجية خارج IIS في وحدة التحكم التطبيق, كل شيء يبدو واقية من الرصاص.يعمل في كل مرة.

أي النصائح التي تساعدني في تشخيص و حل هذه المشكلة سيكون عونا و سوف upvote مثل مجنون!;-)

وذلك بفضل!

هل كانت مفيدة؟

المحلول

هل فكرت في استضافة OCR جزء من التطبيق الخاص بك خارج العملية.

وجود خدمة يمكن أن تعطيك طن من المرونة:

  1. يمكنك تعريف بسيط نقطة النهاية على تطبيق الويب الخاص بك و الوصول إليه عن طريق الاتصال عن بعد أو WCF.
  2. إذا الاشياء شكل الكمثرى و المكتبة كل دودج ، يمكنك الحصول على خدمة إطلاق عملية منفصلة في كل مرة تحتاج إلى تنفيذ OCR.هذا يعطيك السلامة القصوى ، ولكن ينطوي صغيرة نفقات إضافية.أود أن نفترض أن OCR هو أغلى بكثير من الغزل عملية.
  3. يمكنك الاحتفاظ مثيل حول كائن COM, إذا كانت الذاكرة يبدأ تسرب يمكنك إعادة تشغيل نفسك دون التأثير على الموقع (إذا كنت حذرا).

أنا شخصيا قد وجدت في الماضي interop COM + IIS = الحزن.

نصائح أخرى

مودي بشكل لا يصدق متزعزع عندما يتعلق الأمر إلى التخلص من نفسه ، وخاصة في تشغيل IIS.في تجربتي, لقد وجدت أنه على الرغم من أنه يبطئ كل شيء ، الطريقة الوحيدة للتخلص من هذه الأخطاء إضافة GC.WaitForPendingFinalizers() بعد GC.جمع() المكالمة.إذا كنت مهتما, كتبت المادة عن هذا.

يمكنك تكرار هذه المشكلة في وحدة صغيرة ؟ ربما تركها النوم لمدة 30 دقيقة ثم يعود إلى ذلك ؟

أفضل طريقة لحل مثل هذه الامور هو عزل أسفل تماما.سأكون مهتما لمعرفة كيف يعمل.

اضطررت للتعامل مع هذا الخطأ قبل أسبوع بعد اختبار بعض الحلول وإعطاء هنا ، وأخيرا حل المشكلة.سأشرح هنا كيف فعلت ذلك.

في حالتي لدي خدمة windows رونينغ وتجهيز الوثائق من مجلد المشكلة تحدث عندما يكون هناك أكثر من 20 الوثائق رمي الخطأ:استثناء من HRESULT:0x80010105 (RPC_E_SERVERFAULT).

في قانون بلدي كنت استدعاء الأسلوب في كل مرة أكتشف مستند في مجلد ، وجعل مثيل مودي الوثيقة (مودي.الوثيقة _document = مودي الجديدة.الوثيقة();) وأنا عملية الملف, و هذا ما يسبب خطأ!!

كان الحل أن يكون واحد فقط مثيل عالميا مودي.الوثيقة و جميع الوثائق مثقال ذرة ، هذه الطريقة مثيل واحد فقط رونينغ لخدمة بلدي في كل مرة.

وآمل أن تساعد أولئك الذين يواجهون نفس المشكلة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top