2015-03-23 5 views
5

Ich baue eine Website, die Daten von XML-Feeds abrufen wird. Ich baue es als eine MVC AP.NET Anwendung. Ich brauche die Anwendung, um beispielsweise Daten aus den xml-Dateien zu erhalten, die sich alle zwei Minuten auf dem Server des Anbieters befinden. Diese Daten werden dann gespeichert. Mein Problem ist, dass ich möchte, dass diese Prozedur ohne Unterbrechung ab dem Moment durchgeführt wird, wenn die Website auf den Server hochgeladen wird. Ich dachte daran, einen Timer in der Hauptmethode (?) Zu verwenden, um die Daten alle 2 Minuten zu erhalten. Aber ich habe hier nach anderen Themen gesucht und herausgefunden, dass AppFabric die Lösung ist. Das Problem ist, dass ich ein absoluter Anfänger bin und ich finde es schwierig, es zu benutzen ... Gibt es einen anderen, einfacheren Weg, um diese kontinuierliche Aktualisierung von Daten aus der XML-Datei zu erreichen?Festlegen einer MVC ASP.NET-Anwendung für geplante Aufgaben - Methode, um dies zu erreichen?

+0

Die Daten werden in der Datenbank gespeichert, die die ASP.NET-Website verwendet? Könnten Sie das Abrufen nicht in einer Konsolen-App durchführen, die von einem Timer-Job ausgelöst würde? Dann brauchen Sie die Website nicht, um sich darum zu kümmern. Außerdem glaube ich, dass AppFabric hauptsächlich für das Caching verwendet wird. – bump

+0

Warum möchten Sie eine Webanwendung erstellen, wenn Sie keine Webseiten bereitstellen und auf Webanfragen reagieren? Sie sollten dies zu einer geplanten Aufgabe machen oder einen Windows-Dienst schreiben. IIS wird Ihre Website bei Inaktivität herunterfahren, was bedeutet, dass Ihre Aufgabe nicht ausgeführt wird. –

+0

Die Web-App wird Daten aus XML-Feeds abrufen, sie in Listen/Tabellen speichern und in Zukunft einige von ihnen in Datenbanken speichern. Ich brauche die Daten in den Listen/Tabellen, um aktualisiert zu werden und Aktualisierungsdaten an die Ansichten zu senden. Website-Besucher werden nur die Ansichten sehen – user2868674

Antwort

2

Ich würde empfehlen, dass Sie Quarz verwenden, um die Planung zu behandeln, anstatt den eingebauten Timer zu verwenden. Ich habe Quartz in meinen letzten beiden Projekten verwendet und ich war sehr beeindruckt. Es kann mit jedem Zeitplan umgehen, den Sie sich vorstellen können.

http://www.quartz-scheduler.net/documentation/quartz-2.x/quick-start.html

Beispiel die Schaffung von Arbeitsplätzen:

using Quartz; 
using Quartz.Impl; 

IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler(); 
scheduler.Start(); 

IJobDetail integrationJob = JobBuilder.Create<IntegrationJob>().Build(); 

ITrigger integrationTrigger = TriggerBuilder.Create() 
      .StartNow() 
      .WithSimpleSchedule(x => x.WithIntervalInSeconds(300).RepeatForever()).Build(); 

scheduler.ScheduleJob(integrationJob, integrationTrigger); 


public class IntegrationJob : Ijob 
{ 
    public void Execute(IJobExecutionContext context) 
    { 
     //Write code for job 
    } 
} 
+0

Vielen Dank! Aber ich bin ein Anfänger, ich habe eine andere Frage: Die geplante Aufgabe wird die XML-Daten ziehen und aktualisieren Sie die Listen/Tabellen ist das Modell. Dann werden die Ansichten aufgrund der aktualisierten Modelldaten aktualisiert. Funktioniert das unabhängig davon, ob Benutzer die Website besuchen oder nicht, oder? Und wenn der Server neu startet, wird es wieder starten, oder? – user2868674

+0

Sie möchten sicherstellen, dass Sie die Erweiterungsmethode .StartNow() haben, wenn Sie den Job wie oben gezeigt hinzufügen. Dann möchten Sie den Zeitplanungsabschnitt des Codes in eine andere Klasse einfügen oder ihn einfach in Ihre Datei global.asax.cs einfügen. Sobald IIS gestartet wird, wird der Job unabhängig von den Anforderungen ausgeführt, die an den Webserver gestellt werden. – Chance

0

Eine andere, einfachere und straight forward Ansatz ist es, ein Konsolenprojekt in Visual Studio-Lösung zu erstellen und haben die Windows-Taskplaner es kick off. Um dies zu tun, müssen Sie mindestens haben die drei folgenden Projekte in Ihrer Lösung:

  • A-Klassenbibliothek Projekt mit Ihrer Domain Models und Repository-Klassen
  • Die ASP.NET MVC Web-Anwendung (die verweist auf die Domain Models Projekt)
  • Das Console-Projekt (die die Domain Models Projekt verweist)

im Idealfall würden Sie Domain Driven Design zu halten, damit Ihre Geschäftslogik in Ihrer Domain Models verkapselt ist, und daher portabel zwischen Ihrem Web Anwendung und c Onsole-App.

Wirklich, würde ich diese Lösung Setup für jedes Projekt empfehlen, die nur mehr als einen Web-App sein könnten:

  • MyApp.Models: eine Klassenbibliothek für Ihre Domain-Modelle und Repository-Klassen. Nutzen Sie Domain Driven Design und die Repository Pattern Kerngeschäftslogik und den Zugang zu persistenten Speicher tragbar zu machen zwischen VS-Projekte
  • MyApp.Models.Tests: Unit-Tests für Ihre Modelle Klassenbibliothek
  • MyApp.Web: MVC oder WebForms Projekt
  • MyApp.Web.Tests: Einheit und Funktionstests für Ihr Webprojekt.
    • Unit Tests: Verwenden Sie Ihre Lieblings-Teststarter (MS Test, NUnit, xUnit usw.)
    • Funktionstests: CodedUI tests von Microsoft oder WatiN können Sie programmatisch den Web-Browser fahren.Ich würde auch empfehlen SpecFlow für diejenigen, die Behavior Driven Development
  • MyApp.Console zu tun: Die Konsolenanwendung, die ausgeführt werden kann als Hintergrund-Job
  • MyApp.Console.Tests: Unit-Tests für die Konsolenanwendung

Ich weiß, Das scheint mir ein Overkill zu sein, aber nach meiner Erfahrung scheint es, dass Projekte immer im Laufe der Zeit zu dieser Struktur hingezogen werden. Der Aufbau Ihres Projekts mit dieser Struktur ist einfach und gibt Ihnen viel Flexibilität, da The Business den unvermeidlichen Sprung in den Wahnsinn unternimmt und Ihre Bewerbung dazu braucht, alles zu tun, außer Kaffee zu machen (dafür sind die Praktikanten schließlich auch!).

0

Vielleicht möchten Sie sich mit Hangfire befassen. Sie können Aufgaben planen und erhalten ein nettes Dashboard zum Verwalten von Aufgaben. Sie finden es in NuGet und die Dokumentation auf der Hangfire-Website ist ziemlich gut.

Es ist sehr einfach zu bedienen, hier ist ein Beispiel dafür, was man mit der OWIN Startup Klasse hinzuzufügen, wenn Sie einen Job jede Minute ausgeführt werden sollen:

public void Configuration(IAppBuilder app) 
{ 
    app.UseHangfire(config => 
    { 
     config.UseSqlServerStorage("connection string"); 
     config.UseServer(); 
    }); 

    InitializeJobs(); 
} 

public static void InitializeJobs() 
{    
    RecurringJob.AddOrUpdate("jobName",() => CallToJobFunction(), Cron.Minutely); 
} 
Verwandte Themen