1

C# ASP.NET の MVC3/MVC4 の ActionMailer を介して非同期的に送信する電子メールを取得しようとしています。

しかし、私は2つの問題に遭遇しました:

  1. プライベート関数を使用して Task.Run または Task.Start メソッドを使用しようとすると、HttpContext が null になり、電子メールが送信されません。これは、組み込みの非同期配信方法を使用する場合にも当てはまります。

  2. メール送信関数に async/await をかけようとしても、return メソッドが void であるため機能せず、void 関数では await できないと言われました。

両方のシナリオで使用したコードを次に示します (どちらの場合も、e は Model オブジェクトであると仮定します)。

シナリオ 1:

Action mailAction = new Action(() => { OnSentEmail(e); });
Task mailTask = new Task(mailAction);
mailTask.Start();

private void OnSentEmail(Model e)
{
    new MailController().SendMail(e).Deliver();
    //HttpContext is null here, so cannot send mail
}

OR

new MailController().SendMail(e).DeliverAsync();

シナリオ 2:

await Task.Run(async() => await new MailController().SendMail(e).Deliver());

私はまだ非同期メソッドにあまり慣れていませんが、これは私が思いつくことができる最高のようでした。送信する必要がある電子メールはリッチ HTML 形式であるため、通常の SmtpClient を使用することはできません。そのため、電子メールを送信してビューのようにスタイルを設定できるように、ActionMailer を選択しました。

私が必要とするのは、HttpContextを強制することによって(メールを送信するためにMailerBaseがHttpContextからどの情報を使用するのかわかりません)、または非同期/待機できるようにすることで、メールを非同期的に送信できるようにすることです。

4

2 に答える 2

0

HttpContextEmailResult コントローラのSendMailメソッドの戻り値を生成するために必要です。

Deliver()メソッドは別のスレッドで呼び出すことができます。

var verificationEmail = new MailController().SendMail(email, new MailModel());
Task.Run(() => verificationEmail.Deliver());
于 2016-08-23T06:44:10.460 に答える
0

私が思いついた解決策は、電子メールを送信するためのコントローラー メソッドを作成し、元のコントローラー メソッドで、応答に関係なく、そのコントローラー メソッドに Web 要求を行うことでした。このメソッドでは、モデルの ID が送信され、電子メール機能でデータベースから正しいモデルが取得されます。これにより、HttpContext が保持されます。

string url = baseUrl + "/api/Entry/SendEmail?emailId=" + emailId;
WebRequest req = WebRequest.Create(url);
req.Method = "GET";
req.BeginGetResponse(null, null);
于 2013-04-24T00:58:30.317 に答える