2017-04-18 3 views
1

Salut les gars j'essaye d'ajouter une pièce jointe à un email mais j'obtiens cette exception étrange qui n'est pas claire ce que je fais mal. Je reçois la pièce jointe d'un formulaire de saisie de fichierSystem.Mail.Net ne peut pas accéder au fichier fermé Exception en essayant d'ajouter une pièce jointe

<div class="form-group"> 
<br/> 
Select any files to attach to email 
<div class="input-group"> 
    <label class="input-group-btn btn btn-default btn-file" id="attachFiles"> 
     Upload <input type="button" id="attach" name="Upload" style="display: none" value="Upload"/> 
    </label> 
    <label class="input-group-btn btn btn-default btn-file"> 
     Browse <input type="file" id="attachInput" multiple="false" style="display: none"/> 
    </label> 
    <input type="text" disabled="disabled" id="attachText" class="form-control input-group-addon"/> 
</div> 
<br/> 
<ul id="issueFormAttachName" class="list-group list-inline"></ul> 

Alors je reçois ces fichiers via la demande et de les stocker dans une variable publique pour y accéder ultérieurement via un contrôleur différent

[HttpPost] 
    [Route("home/saveAttachment")] 
    public ActionResult SaveAttachment() 
    { 
     try 
     { 
      EmailAttachments = new EmailAttachments 
      { 
       FileCollectionBase = Request.Files 
      }; 
      return Json("Ok"); 
     } 
     catch (Exception ex) 
     { 
      return Json("Error occurred. Error details: " + ex.Message); 
     } 
    } 

Après cela, j'appelle mon contrôleur pour envoyer l'e-mail en utilisant ce fichier

string usersToReceived = ""; 
      EmailMessage email = new EmailMessage 
      { 
       InnerHtmlBody = emailDto.EmailBody, 
       Subject = $"Support enquiry ticket number #{issueId}", 
       EmailHeader = "Thank you for contacting support" 
      }; 
      emailDto.Users.ForEach(u => usersToReceived += u + ";"); 


      Dictionary<string, Stream> streams = new Dictionary<string, Stream>(); 

      //Check if attachments exist 
      if (HomeController.EmailAttachments?.FileCollectionBase.Count > 0) 
      { 

       foreach (string streamName in HomeController.EmailAttachments.FileCollectionBase) 
       { 
        streams.Add(streamName, HomeController.EmailAttachments.FileCollectionBase[streamName].InputStream);  
       } 
       foreach (string file in HomeController.EmailAttachments.FileCollectionBase) 
       { 
        //make sure stream is not disposed untill send is done 
        //Streams dont need to be explicitly disposed 
        email.AddAttachment(streams[file], file, HomeController.EmailAttachments.FileCollectionBase[file]?.ContentType); 
       } 
      } 

      email.Send(usersToReceived); 

    } 

La méthode d'ajout de pièce jointe juste ca lls le constructeur natif Attachment

Maintenant, parfois, quand je vider mon cache et essayer d'utiliser le code ci-dessus, cela fonctionnera mais la plupart du temps cela jettera une exception avec l'erreur Impossible d'accéder au fichier fermé quelqu'un sait ce qui se passe ici? Je ne ai essayé d'avoir une méthode de cache clair à la fin mais cela ne fonctionne pas

+2

Vos pièces jointes meurent avec un pipeline MVC. Si vous réécrivez le contenu de Request.Files à une autre variable ICollection et que vous le stockez, il fonctionnera comme un charme. –

+0

merci va donner un coup – Harry

+0

Salut une autre question quand ai-je besoin de les réécrire au moment de la Request.Files ou plus tard ou avant que j'appelle l'envoi? Parce que je ne vois pas où mon application quitte le pipeline MVC – Harry

Répondre

1

Il est asp.net mvc pipeline astuce:

Chaque action dans les contrôleurs sont appelés par la réflexion, donc, ils sont différents pipelines.

Lorsque vous au premier magasinRequest.Files dans votre variable statique - il est disponible uniquement en pipeline ne pas mourir.

Ensuite, vous appelez une autre action et votre variable Request est différente, donc, ils ne stockent plus la propriété Files. Pour l'éviter, vous avez besoin de quelque chose pour stocker les données entre les requêtes: base de données, variable statique, ou quelque chose comme ça.