2016-11-01 64 views
0

我使用MVCMailer,它依賴於HttpContext發送郵件。爲MvcMailer創建新的HttpContext,這樣我就可以使用異步/等待

在某些情況下,我從WebJob發送郵件,或者在調用ConfigureAwait(false)的流中使用的異步任務中發送郵件,這樣在我點擊MVCMailer代碼之前就會丟失上下文。

我的選擇似乎是:

  • 切勿使用ConfigureAwait(false)(所以我的很多服務使用郵件在某些時候,所以這一個實例將刪除我需要的情況下)
  • 新建了一個的HttpContext如果需要的話,這樣我可以郵寄儘管沒有一個
  • 不使用MvcMailer和使用第三方

我正在尋找快速和簡單的解決方案 - newing了一個HttpConte xt如果需要。這可能嗎?

這是我現在使用的代碼依賴於HttpContext的:

public class UserMailer : MailerBase { 
    public UserMailer() { 
     MasterName = "_Layout"; 
    } 

    public virtual MvcMailMessage Message(MailMessage message, string unsubscribeLink = null) { 
     ViewBag.Body = message.Body; 
     ViewBag.Subject = message.Subject; 
     ViewBag.UnsubscribeLink = unsubscribeLink; 
     return Populate(x => { 
      x.ViewName = "Message"; 
     }); 
    } 
} 
+0

如果你有代碼去除請求的上下文*當你仍然打算在請求的上下文中*那麼這是一個錯誤,而不僅僅是爲了這個類的目的,但總的來說,因爲它需要被修復。只有在確定該方法及其調用的任何內容在概念上與請求無關時,該代碼才應該刪除當前上下文。 – Servy

+0

@Servy這就是爲什麼我列出了第一個選項,這是我想避免的。 – SB2055

+0

試圖避免修復最終會導致各種應用程序問題的各種問題,而不僅僅是這部分,並不會很好地結束。如果你的程序不適當地在必要的上下文之外運行代碼,那麼你應該修復這個問題。 – Servy

回答

0

如果MvcMailer都必須有一個HttpContext的參考,我想它抽象。創建一個通用的郵件接口或基類(看起來像你現在有MailerBase)如果您有:

public class WebJobMailer : MailerBase { .. } 

然後你就可以有webjob使用此實現,但你的MVC應用程序的執行MvcMailer ... WebJob郵件程序可以回退到System.Net.Mail,或者使用其他的東西。

+0

但是,我不能使用MVCMailer - 這正是我想要做的。 – SB2055

+1

我不會推薦嘗試製作一個假的HttpContext來讓MvcMailer工作 - 這就是有時候基於HttpContext的服務的問題......你永遠不知道它調用哪些API方法,它們通常高度依賴於Web環境。 ..除非網絡作業調用發送消息的IIS服務器上的網頁(顯然許多移動部件可能有問題)。 –