Webservice / WCF (механизм обновления таймера) - PullRequest
2 голосов
/ 10 августа 2010

Я пытаюсь создать (csharp) один движок веб-сервиса / WCF, который выполняет два действия:

  1. Есть один таймер (поток), который будет запускаться каждые 10-10 минут, запрашивая некоторую информацию (соединяясь с другим сервером для получения некоторого информационного статуса) для обновления в одной базе данных. (Это должно быть автоматическим, и никакие человеческие действия не будут доступны). Идея заключается в том, чтобы веб-сервис автоматически (10x10 минут) обновлял базу данных с последним статусом информации.

  2. Один сервисный метод, который получает некоторую информацию из одной базы данных. (Это один простой метод, который дает информацию, когда кто-то ее запрашивает). Этот метод отвечает за выбор информации о состоянии из базы данных.

Проблема в шаге 1, потому что шаг 2 очень прост.

Может ли кто-нибудь помочь мне с идеями или некоторым кодом, как к шагу 1. Любой шаблон должен быть использован здесь?

Ответы [ 2 ]

2 голосов
/ 10 августа 2010

Поскольку это веб-приложение (например, тип проекта «Приложение-служба WCF» в VS2010), вы можете подключиться к событиям приложения.

По умолчанию этот тип шаблона проекта не создает Global.asax, поэтому вам нужно «добавить новый элемент» и выбрать «Global Application Class» (он не будет доступен, если у вас уже есть Global. asax, FWIW).

Тогда вы можете просто использовать начальные и конечные события в приложении, чтобы запускать и останавливать таймер, например:

public class Global : System.Web.HttpApplication
{
    private static readonly TimeSpan UpdateEngineTimerFrequency = TimeSpan.FromMinutes(10);
    private Timer UpdateEngineTimer { get; set; }

    private void MyTimerAction(object state)
    {
        // do engine work here - call other servers, bake cookies, etc.
    }

    protected void Application_Start(object sender, EventArgs e)
    {
        this.UpdateEngineTimer = new Timer(MyTimerAction,
                                           null, /* or whatever state object you need to pass */
                                           UpdateEngineTimerFrequency,
                                           UpdateEngineTimerFrequency);
    }


    protected void Application_End(object sender, EventArgs e)
    {
        this.UpdateEngineTimer.Dispose();
    }
}
0 голосов
/ 11 августа 2010

Принцип единой ответственности предлагает разделить эти две обязанности на две службы. Один (служба Windows) будет обрабатывать таймер. Вторая, Служба WCF, будет иметь единственную операцию для запроса базы данных и возврата данных.

Это независимые функции, которые должны быть реализованы независимо.

Кроме того, я бы рекомендовал не использовать IIS или Application_Start и аналогичные методы. Это предотвратит размещение вашей службы WCF в WAS или другой среде. Имейте в виду, что WCF гораздо более гибкий, чем веб-сервисы ASMX. Это не ограничивает, где вы размещаете свой сервис. Вы должны тщательно подумать, прежде чем налагать такие ограничения на свои собственные услуги.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...