10
votes

Comment utiliser Modi dans une application Web ASP.NET?

J'ai écrit une bibliothèque d'emballages OCR autour de l'API de Microsoft Office Document Imaging, et dans une application de console qui fonctionne localement, cela fonctionne parfaitement, avec chaque test.

Malheureusement, les choses commencent à s'intégrer Avec un service WCF exécutant en tant qu'application Web ASP.NET, sous IIS6. Nous avions des problèmes d'essayer de libérer les objets Modi Com, et il y avait beaucoup d'exemples sur le Web qui nous a aidés.

Cependant, des problèmes restent toujours. Si je redémarre IIS, et faites un nouveau déploiement de l'application Web, les premières tentatives OCR fonctionnent bien. Si je le laisse pendant 30 minutes environ, puis effectuez une autre demande, je reçois des erreurs de défaillance de serveur comme celle-ci:

Le serveur a jeté une exception. (Exception de HRESULT: 0x80010105 (RPC_E_SERVERFAULT)): à modi.documentclass.create (String FileOpen)

à partir de ce point sur, chaque demande ne parviendra pas à effectuer l'OCR, jusqu'à ce que je réinitialise IIS et que le cycle commence à nouveau.

Nous exécutons cette application dans sa propre piscine d'app propre et Il fonctionne sous une identité avec les droits de l'administrateur local.

Mise à jour: Ce problème peut être résolu en effectuant les trucs OCR hors du processus. Il apparaît comme si la bibliothèque Modi ne joue pas bien avec le code géré, lorsqu'il s'agit de nettoyer après elle-même, le frai de nouveaux processus pour chaque demande d'OCR a bien fonctionné dans ma situation.

Voici la fonction qui effectue l'OCR: xxx

i puis instanciez une instance d'ImagerPeaderAder à l'aide d'un bloc d'utilisation (qui appellera Idisposable.Dispose à la sortie) < p> appeler marshal.finalRelReeeSecomObject doit demander au CLR de libérer les objets COM, et donc je suis une perte de déterminer ce que nous causerait les symptômes que nous disposons.

pour ce que ça vaut la peine, en cours d'exécution Code en dehors de IIS, en disant une application de console, tout semble preuve de balle. Cela fonctionne à chaque fois.

Tous les conseils qui m'aident à diagnostiquer et à résoudre ce problème seraient une aide immense et je suis uppote comme un fou! ; -)

merci!


1 commentaires

Merci de m'avoir adressé à la Bounty, content que cela vous ait aidé!


4 Réponses :


1
votes

Modi est incroyablement bonky quand il s'agit de se débarrasser de lui-même, surtout en cours d'exécution dans IIS. Dans mon expérience, j'ai découvert que bien que cela ralentit tout, le seul moyen de se débarrasser de ces erreurs consiste à ajouter un GC.WaitForPendingFinalisations () après votre appel GC.Collect (). Si vous êtes intéressé, j'ai écrit un article à ce sujet. < / p>


4 commentaires

Excellent article, merci de la référencer ici. Je vais examiner la mise en œuvre de cette suggestion et conseiller le résultat.


Merci beaucoup. Espérons que cela vous aide à sortir avec votre situation actuelle.


Malheureusement, mon problème reste toujours. Je mettrai à jour mon message original avec le nouveau code source et je vois ce que la communauté pense. Merci d'avoir essayé quand même!


Modi m'a donné de nombreux maux de tête. Tout d'abord, c'était des problèmes de versement, alors c'était des problèmes de corruption des fichiers lors de l'annotant des télécopies sur les lecteurs de réseau. "Wonky" est un bon terme pour cela! ;)



1
votes

Pouvez-vous reproduire le problème dans une petite application de console? Peut-être laissé-le dormir pendant 30 minutes et y retourner?

meilleur moyen de résoudre des choses comme ceci est de l'isoler totalement. Je serais intéressé de voir comment cela fonctionne.


7 commentaires

C'est une très bonne idée, merci soyeux. Mon appuie sur la console n'est jamais échoue, mais je ne l'ai jamais assis non plus. Il fait simplement exécuter les tests et sort, vraisemblablement en jetant correctement les références aux objets COM. Je modifierai l'application de la console et vous permettra de savoir comment les choses se passent. À votre santé


Mon seul point réel est que vous exécutez une autre version d'un exe incompatible (par exemple, en exécutant deux versions .NET différentes dans le même pool d'applications) et c'est en quelque sorte corrompre la DLL. Cela expliquerait la raison pour laquelle cela fonctionne après un redémarrage.


Bien que je n'ai pas encore résolu cela, votre commentaire était incroyablement utile. J'ai réussi à reproduire le problème dans une application de console longue d'exécution afin que je puisse maintenant éliminer IIS comme étant la cause du problème. Merci encore pour l'indice.


Je me demande s'il y a un moyen d'ajouter quelques traces pour regarder ce que le collecteur des ordures fait (comme un autre posté). Peut-être que c'est expirer des objets que le com a besoin. Il suffit de deviner tout à fait maintenant, mais s'il y a une option pour activer la sortie Verbose GC, essayez peut-être et activez-la. Je suppose que vous avez essayé de reproduire sur d'autres machines avec le même résultat?


Attendez. Je viens de remarquer que vous avez un dispositif qui essaie de supprimer certaines choses. Avez-vous toujours eu ça? Ou est-ce nouveau? Je pense que c'est nouveau, mais je ne suis pas sûr que ce soit une bonne idée ...


Salut Silky, Tracing à regarder quand et comment le GC fait la magie est une bonne idée. Pourrait avoir à examiner cela. Oui, j'essaie d'utiliser l'interface Idisposable comme moyen de ranger les références COM. Avant de la mettre en œuvre, nous avons rencontré des ennuis avec la bibliothèque Modi ne laissant pas aller des images TIF qu'il lisait. Pour l'instant, j'essaie la suggestion de Sam Saffrons de faire de l'OCR Stuff hors du processus, car si elle échoue, je peux toujours faire tourner un autre processus, ce qui ne sera probablement pas cassé. C'est au mieux une solution de contournement, mais cela pourrait faire l'affaire. Merci pour toute votre aide.


S'il a échoué dans l'application de la console, cela échouera certainement dans un nouveau processus, toutes les 10 minutes. Je suis vraiment intéressé par la raison pour laquelle il se bloque après cette heure. Je serais aussi intéressé; Et si vous faites des appels consistants toutes les 5 minutes, pour traiter une image. Est-ce que ça échoue après 10 encore?



4
votes

Avez-vous pensé à héberger la partie OCR de votre application hors de processus .

Avoir un service peut vous donner des tonnes de flexibilité:

  1. Vous pouvez définir un point final simple pour votre application Web et l'accéder via des télécommandes ou de la WCF.
  2. Si des trucs sont la forme de poire et la bibliothèque est toute esquive, vous pouvez disposer du service de lancer un processus distinct à chaque fois que vous devez effectuer OCR. Cela vous donne une sécurité extrême, mais implique une petite dépense supplémentaire. Je supposerais que OCR est beaucoup plus cher que de filtrer un processus .
  3. Vous pouvez conserver une instance autour de l'objet COM, si la mémoire commence à fuir que vous pouvez redémarrer vous-même sans avoir un impact sur le site Web (si vous faites attention).

    Personnellement, j'ai trouvé dans le passé le com interop + iis = chagrin.


3 commentaires

Bonjour Sam, oui, c'est quelque chose que j'ai essayé cette semaine. Je pose les trucs OCR dans un service Windows hébergé séparément à l'aide de WCF (et de Netcpbinding). J'ai toujours eu des symptômes très similaires à quand je l'exécutais sous IIS. Basé sur une indice de Silky, j'ai essayé une application de console longue en cours (par opposition à la courte version d'exécution que j'avais écrite) et a réussi à reproduire le problème dans les 10 minutes. Cependant, peu importe ce que le problème s'avère être, je vais +1 votre réponse, car il a beaucoup plus de sens de faire ce genre de choses hors processus, car exactement les raisons que vous avez décrites. Merci.


Oh, en outre, je n'ai pas pensé à tourner un nouveau processus, c'est une excellente idée aussi. En fait, cela pourrait simplement être un bon travail, car je peux attraper l'exception Interping Com, et faire tourner un nouveau processus ... Cool, je suis excité maintenant. Je vais essayer et rapporterai. Merci encore.


Cela a travaillé un régal. J'ai écrit un service Windows, hébergeant un service de WCF qui remonte à un nouveau processus d'emballage des objets OCR pour chaque demande. Oui, cela semble cher, mais comme vous l'avez souligné, il est insignifiant à côté du coût de l'OCR actuel lui-même. La fermeture du processus nettoie correctement les éléments «Wonky 'Modi Interop, et tout fonctionne comme si cela devrait. Merci Sam et toutes les personnes impliquées. Très appréciée.



1
votes

J'ai dû faire face à cette erreur il y a une semaine et après avoir testé certaines solutions qui donnent ici, j'ai finalement résolu le problème. Je vais expliquer ici comment je l'ai fait.

Dans mon cas, j'ai un service de gestion et de traitement de service Windows à partir d'un dossier, le problème se produit lorsqu'il y a plus de 20 documents, jetant l'erreur: Exception de HRESULT: 0x80010105 (RPC_E_SERVAULT).

Dans mon code, j'appelle une méthode à chaque fois que je détecte un document dans le dossier, je fais une instance de document Modi (modi.document _document = nouveau modi.document ();) et je traite le fichier, et que était ce qui cause l'erreur !!

La solution consistait à avoir une seule instance globale de modi.document et de traiter tous les documents qui l'attendent, de cette façon, je n'ai qu'une seule instance qui effectue mon service de tous les temps.

J'espère que cela aidera ceux qui font face au même problème.


0 commentaires