2010-10-31 34 views
1

Résumé
Nous avons une application ASP.NET qui permet aux utilisateurs d'interroger une base de données SQL Server via une couche intermédiaire (plutôt standard) . Lorsque l'utilisateur tente de générer un fichier PDF pour les lignes qui leur ont été renvoyées. Chaque ensemble de lignes avec un identifiant commun «se transforme» en une page distincte dans le PDF résultant. A l'origine, je supposais que le nombre de lignes serait d'un ordre de grandeur qui conduirait à acheminer le PDF final dans le flux de réponse ASP et à laisser l'utilisateur télécharger le fichier sur sa machine, mais les nouvelles exigences indiquent que le nombre de lignes est très grand et très en dehors de l'échelle pour laquelle j'avais conçu cela.Comment opérations temps d'arrière-plan/IO-consommation à travers un pare-feu dans ASP.NET C#

Ma solution actuelle est la suivante:

  1. Si le nombre de lignes retournée est supérieure à une configuration valeur threshold, l'utilisateur reçoit un message qui demande qu'ils veulent ou non pour générer les années PDF dans la arrière-plan et être notifié par e-mail avec une URL lorsque c'est fait, afin qu'ils puissent les télécharger.

  2. Si acceptable pour l'utilisateur, je crée deux DataTable s: Un avec les données réelles, et un avec MetaData, par exemple où enregistrer le fichier PDF résultant, le nom et d'autres informations de type méta. Je peux ensuite utiliser DataTable.WriteXML pour générer un fichier "travail" dans un dossier particulier.

  3. Tout cela est fait dans un thread séparé, afin que l'utilisateur puisse continuer à faire ce qu'il veut.

Problème:
Je veux vraiment stocker le fichier xml du travail sur une machine dans notre pare-feu (dossier réseau partagé), mais il semble que je ne peux pas pour des raisons de sécurité. On m'a dit que je pourrais vouloir utiliser Usurpation d'identité et j'ai essayé, mais je ne pouvais pas le faire fonctionner. L'autre partie de cette application est quelque chose qui "écoute" le dossier "input", et traite ces fichiers "job" une fois par heure (ou un calendrier similaire), déplace le fichier PDF généré à l'emplacement requis et envoie un email à l'utilisateur. J'ai obtenu la partie qui lit les fichiers de travail et génère le travail PDF, et la partie qui crée les fichiers de travail fonctionne (quand je l'exécute dans le pare-feu), mais quand je l'exécute en dehors du pare-feu, j'essaye même , ça ne marche pas. (Ne cesse de dire « emplacement réseau introuvable »

Question (s):.?
Vais-je sur ce la bonne façon
Comment puis-je écrire ces fichiers à travers le pare-feu
Toutes les idées de conception ou suggestions?

Merci à l'avance.

+0

De quel côté du pare-feu se trouve le serveur SQL Server/Web? (Je suppose qu'il est à l'extérieur?) – realworldcoder

+0

Le SQL Server est à l'intérieur du pare-feu. – funkymushroom

Répondre

0

Comment j'ai résolu ce fut de créer une table appelée PDFJobs sur notre base de données.

Ce tableau contient les Les critères utilisés pour exécuter le rapport ainsi que le dossier du modèle souhaité et fichier, le dossier cible et nom pour le PDF résultant. J'ai ensuite écrit un outil de ligne de commande (PDFGenerator) qui lit à partir de cette table, et pour chaque ligne, crée un thread séparé qui effectue la génération PDF. Une fois le fichier PDF généré, il envoie un e-mail à une adresse e-mail (également contenue dans le tableau).

Ensuite, j'ai une tâche planifiée par Windows qui exécute cet outil PDFGenerator toutes les heures.
Ce n'est pas une idée, mais ça fait l'affaire.

Une mise à jour récente est qu'ils veulent quelque chose qui va déclencher le PDFGenerator chaque fois qu'une ligne de travail est créée ... Je suppose que je vais devoir réfléchir davantage à ce sujet.

1

Pouvez-vous au moins faire http à travers le pare-feu? Alors ne pas créer un fichier XML, mais appeler un service web qui est à l'intérieur du pare-feu. Idealy, ce service Web serait pas créer un fichier XML non plus, mais je nstead place les données dans une file d'attente de messages. MSMQ pourrait être utile ici. Le générateur PDF lirait alors le XML de cette file d'attente. De cette façon, vous ne rencontrerez pas la situation où le générateur récupère un fichier qui n'est pas encore terminé. Et vous ne perdez pas de temps et de ressources à interroger les fichiers.

Espérons que cela aide.

+0

C'est une bonne idée, je vais l'essayer et vous le faire savoir. – funkymushroom

+0

C'est agréable d'entendre ça. Si vous voulez vraiment le faire, regardez dans WCF. WCF fait un bon travail d'écriture et de lecture à partir d'une file d'attente msmq. –

+0

Autant que je voulais l'imaginer, les contraintes de temps et l'attention managériale étaient des restrictions. Je n'avais pas le droit d'utiliser MSMQ pour diverses raisons, dont l'un était que nous avions un autre outil qui l'utilise intensément et que toute utilisation de MSMQ serait perçue comme un impact potentiel. J'ai résolu cela d'une autre manière, que je détaillerai ci-dessous. – funkymushroom