1

頭を包むことができないというかなり奇妙な問題があります。コードは次のとおりです。

[HttpGet]
[AllowAnonymous]
public ActionResult SendEmail()
{
    SendRegisterEmail("Test", "Testagain", "lastTest");
    return View("Index");
}

public async Task<bool> SendRegisterEmail(string subject, string message, string to)
{
    var email = new Email();
    var mailAddress = new MailAddress(to);
    email.Subject = subject;
    email.Body = message;
    var mailAddressCollection = new MailAddressCollection();
    mailAddressCollection.Add(mailAddress);
    email.To = (mailAddressCollection);

    return await Send(email);
}

私の問題を証明するために、コードを1行に分割して、どの行で壊れているかを確認できるようにしました。これが私が見つけたものです:

これをデバッグしてSendRegisterEmailメソッドにステップインすると、実行されるという行var mailAddress = new MailAddress(to);が実行され、関数を終了して行が実行されreturn View("Index");、ページが読み込まれます。奇妙なことに、最後に Send にロギング メソッドを追加しましたが、そのロギングはヒットしません。Send にブレークポイントを設定しましたが、ヒットすることはありませんでした。これは、電子メールの作成がクラッシュしたかのようであり、呼び出し元関数に終了することを決定し、コードを続行しました。

その理由について、私はかすかな手がかりを持っていません。

4

1 に答える 1

2

SendRegisterEmailメソッドは非同期です。あなたはそれを待っていません。

現在、ファイア アンド フォーゲット操作を開始すると、新しいインスタンスreturn Viewの作成中に命令が実行されます。MailAddressほとんどの場合、例外が別のスレッドでスローされるため、キャッチできないスローがスローされます。 FormatException

アクションメソッドを次のように更新します

public async Task <ActionResult> SendEmail()
{
    await SendRegisterEmail("Test", "Testagain", "lastTest");
    return View("Index");
}

また、返品が実際に必要なくなる前に待機している場合は、次のように変更できます。

public Task<bool> SendRegisterEmail(string subject, string message, string to)
{
    var email = new Email();
    // ... 
    return Send(email);
}

しかし、それはあなたが抱えている問題とは関係ありません。

于 2016-07-15T20:38:57.183 に答える