2016-05-31 16 views
6

Sto lavorando a un'applicazione ASP.NET Core RC2. È necessario che questa applicazione invii periodicamente determinate attività, come l'invio di e-mail o il richiamo di una specifica logica aziendale.Esecuzione periodicamente di attività in background in un'applicazione ASP.NET Core RC2

Sono consapevole del fatto che esistono librerie di terze parti come Hangfire o Quartz.NET che forniscono questa funzionalità di pianificazione immediata. Tuttavia, non credo che nessuno di questi supporti attualmente supporti ASP.NET Core RC2. Ci sono altre opzioni disponibili compatibili con ASP.NET Core RC2?

In caso contrario, suppongo che una possibile opzione sia quella di utilizzare una di queste librerie di terze parti da un servizio Windows separato, che potrebbe quindi scegliere come destinazione una versione supportata di .NET. Questo servizio può quindi effettuare periodicamente richieste all'applicazione ASP.NET tramite la relativa API Web per richiamare le attività.

Tuttavia preferirei non avere un servizio separato in quanto aumenta il numero di parti in movimento e complica lo sviluppo della nostra applicazione.

+1

Dove stai eseguendo l'applicazione? Azzurro? Se si utilizza il servizio App di Azure, è possibile utilizzare i ruoli Worker per distribuire le applicazioni in background su – Tseng

+0

@Tseng, grazie per la risposta. Sì, verrà distribuito in Azure. Stai suggerendo ruoli di lavoro come alternativa all'utilizzo di Hangfire/Quartz.NET, o stai suggerendo che Hangfire o Quartz.NET verrebbero utilizzati all'interno di un ruolo di lavoratore? Un WebJob è un'alternativa fattibile a un ruolo di lavoratore? – aw1975

risposta

1

Utilizziamo una semplice applicazione "task runner" che accetta i parametri della riga di comando per determinare il servizio Web/Windows da chiamare. Quindi utilizzare l'Utilità di pianificazione di Windows per chiamare l'applicazione "Task Runner". Quindi non importa ciò che il servizio è o ciò che la tecnologia è stato scritto in.

3
  • Se ci si rivolge la versione completa di .NET CLR allora ogni libreria che ha lavorato prima funzionerà ora. Questo non è cambiato in RC2. Azure WebJobs è un'altra soluzione, oltre a quelle che hai già menzionato.

  • Per CoreCLR non sono a conoscenza di alcun framework già compatibile. Potrebbe essere necessario trovare la propria soluzione o interrompere l'applicazione in due parti facendo in modo che tutto il codice pianificato sia completo in .NET o creando una piccola app in .NET completo che richiami una versione CoreCLR.

1

Si può sempre dare a Quartz v3 build a go. È già in esecuzione su CoreCLR e i test stanno passando. Devi comunque creare da te le sorgenti usando Visual Studio. See the v3 branch.

Al momento, la più grande avvertenza è la serializzazione incompatibile poiché v2 può solo serializzare binario in database (mappe dei dati di lavoro ecc.) E v3 supporta solo JSON come formato di serializzazione. La storia potrebbe cambiare visto che stanno pensando di riportare BinaryFormatter dopo tutto.

Quindi direi che se sei felice di usare solo RAMJobStore senza la persistenza del database, dovresti essere d'oro. Probabilmente funzionerà meglio della soluzione artigianale.

+0

Grazie - Farò sicuramente un tentativo. Abbiamo usato Quartz nel mio precedente lavoro e ha funzionato molto bene per noi. – aw1975

5

Un approccio manuale:

  • Crea una Service contenente il codice di lunga durata, di preferenza async
  • Aggiungi un ciclo while al servizio con una pausa (anche preferibilmente async)
  • chiamata la lunga corsa metodo della classe di servizio in una nuova discussione con Task.Run(() => ... o nel pool di thread (o in una versione precedente Thread).
  • Creare un'istanza della classe in Startup.cs
  • Utilizzare services.AddSingleton(MyServiceInstance); in Configure(... all'avvio.cs
Problemi correlati