2017-04-18 10 views
1

こんにちは、電子メールに添付ファイルを追加しようとしていますが、私は何が間違っているのかわかりません。 私は、ファイルの入力フォームから添付ファイルを取得していますSystem.Mail.Netは閉じたファイルにアクセスできない添付ファイルを追加しようとしたときに例外が発生する

<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> 

それから私は、リクエストを経由して、このファイルを取得し、別のコントローラ

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

を経由して、後でそれらにアクセスするパブリック変数に格納していますこの後、私は、このファイル

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

    } 

追加取り付け方法だけでCAを使用して電子メールを送信するために私のコントローラを呼び出しています

時にはキャッシュをクリアして上記のコードを使用しようとすると、これはうまくいくが、ほとんどの場合、これはエラーで例外をスローすることができないアクセスできないクローズドファイルの誰もが何をしているのか知っている?私は最後にキャッシュのクリア方法を持ってみましたでしたが、これはそれがasp.net mvc pipelineトリックです

+2

あなたの添付ファイルはMVCパイプラインで消滅します。 Request.Filesコンテンツを別のICollectionの変数に書き換えて保存すると、魅力的なように機能します。 –

+0

ありがとうございます。 – Harry

+0

こんにちは別の質問私はRequest.Filesのポイントでそれらを書き直す必要がありますか?私のアプリケーションがMVCパイプラインをどこに残すかわからないからです。 – Harry

答えて

1

を動作しませんでした:コントローラーの各アクションが反射によって呼び出されるので、これらのパイプラインが異なっている

ときあなたの静的変数の最初のRequest.Filesで - それはパイプラインがを死なない間のみ利用可能です。

次に、別のアクションを呼び出し、リクエスト変数が異なるなので、それらはもうFilesプロパティを保存しません。

これを避けるには、データベースや静的変数などの要求間にデータを格納する必要があります。

関連する問題