5

MVC アプリケーションがあり、Hangfire と Postal を使用して電子メールを送信しようとしています。メールは登録後に送信する必要があります。登録は正常に行われますが、実行したジョブがキューに入れられたままになり、メールが届きません。したがって、私の MVC コントローラーには次のコードがあります。

public async Task<ActionResult> Register(RegisterViewModel model)
{
    //register correctly the user

    //I send the email
    BackgroundJob.Enqueue(() => 
        NotifyRegistration(user.Id, user.UserName, user.Email)   
    );

    ...
 }

[AutomaticRetry(Attempts = 5)]
public async Task NotifyRegistration(string userId, string username, string email)
{
    //I calculate callbackUrl

    var viewsPath = Path.GetFullPath(HostingEnvironment.MapPath(@"~/Views/Emails"));
    var engines = new ViewEngineCollection();
    engines.Add(new FileSystemRazorViewEngine(viewsPath));

    var emailService = new EmailService(engines);

    var emailToSend = new NewRegisteredUserEmail
    {
        To = email, UserName = username, CallbackUrl = callbackUrl 
    };

    emailService.Send(emailToSend);
}

NotifyRegistration メソッドをデバッグできません。どうしてか分かりません。私は Postal を使用しているため、EmailService は私の実装ではありません。ここで、smtp サービスの構成方法を示します。

<system.net>
  <mailSettings>
    <smtp deliveryMethod="Network">
      <network host="smtp.live.com" port="25" enableSsl="true" userName="***" password="***"></network>
    </smtp>
  </mailSettings>
</system.net>

hangfire ダッシュボードを実行すると、キューに入れられたジョブが表示されます

ここに画像の説明を入力

しかし、他に何も起こりませんでした。電子メールを送信するのに何が欠けていますか?

ありがとうございました

更新 startup.cs で、私はこれを書きました:

var options = new SqlServerStorageOptions
{
    QueuePollInterval = TimeSpan.FromSeconds(1)
};

GlobalConfiguration.Configuration
     .UseSqlServerStorage("DbConnectionString", options)
     .UseFilter(new LogEmailFailureAttribute());

 app.UseHangfireDashboard();
 app.UseHangfireServer();

更新 2 NotifyRegistration を次のように変換しました。

[AutomaticRetry(Attempts = 5)]
public async Task NotifyRegistration(string userId, string username, string email, EmailService emailService)
{
    //I calculate callbackUrl

    var emailToSend = new NewRegisteredUserEmail
    {
        To = email, UserName = username, CallbackUrl = callbackUrl 
    };

    emailService.Send(emailToSend);
}
4

3 に答える 3

5

問題が見つかりました:

  1. SQL サーバーのバージョンがサポートされていませんでした。私は 2005 を使用していました。サポートされているデータベースは 2008R2 以降です: http://docs.hangfire.io/en/latest/configuration/using-sql-server.html

  2. メソッド NotifyRegistration は静的でなければなりません: https://discuss.hangfire.io/t/jobs-in-enqueue-state-most-never-run/2367/4

.

[AutomaticRetry(Attempts = 5)]
public static void NotifyRegistration(string userId, string username, string email, EmailService emailService)
{
    //I calculate callbackUrl

    var emailToSend = new NewRegisteredUserEmail
    {
        To = email, UserName = username, CallbackUrl = callbackUrl 
    };

    emailService.Send(emailToSend);
}
于 2016-09-19T13:06:29.813 に答える
1

Hangfire の設定を確認せずに...

app.UseHangfireServer();どこかにありますか?これが、Hangfire に実行を行う必要があることを伝えるものです。それ以外の場合は、他の何かが実行を行うことを期待しているため、単にキューに入れているだけです。

于 2016-09-16T12:33:40.133 に答える
0

私の推測では、それはどちらかと関係がある

  1. HostingEnvironment.MapPath() への呼び出し、または
  2. EmailService 型の内部構造の詳細。

私を驚かせたのは、この方法では非常に多くのことが行われており、次の場合に大幅に単純化できることです。

  1. 新しい EmailService をインスタンス化するのではなく、既にインスタンス化された依存関係として包含クラスに渡しました。
  2. メソッド内からテンプレートディレクトリへの物理ファイルパスを推測しようとするのではなく、引数としてメソッドに渡しました。

このリファクタリングを実行すれば、少なからず多くの子猫がこの問題を解決できるに違いありません。

于 2016-09-16T12:31:38.633 に答える