2009-10-19 4 views
1

У меня есть сценарий проектирования, который дает мне несколько головных болей, и мне интересно, какое решение является лучшим решением.Хостинг длительный процесс в IIS

У меня есть приложение, похожее на приборную панель, которое проверяет информацию из службы, для которой требуется соединение с RMI для Java, для сбора данных в реальном времени. Я хотел бы реализовать этот компонент панели мониторинга в silverlight и предоставить данные с помощью WCF.

Я разработал решение для этого в прошлом с удаленными удаленными сетями и формами Windows. Мой предыдущий проект был сервисом Windows, но мне интересно, есть ли у меня способ разместить эту службу, например приложение в IIS.

служба должна: -> Открыть соединение RMI (это я сделал с IKVM) -> тянуть данные через регулярные интервалы -> Обновление клиентов новые данные прибыли (паттерн наблюдатель)

Могли

Я реализую экземпляр singleton моего класса сбора данных и регистрирует наблюдателей? Должен ли я просто размещать WCF в службе Windows? Любые другие идеи?

ответ

1

Веб-архитектура в основном касается ответа на запросы. Вы можете имитировать PUSH с повторным опросом от клиента, но если клиент не активно ищет информацию, вы не можете нажать на нее.

В зависимости от потребностей вашего клиента это звучит как веб-сервис с фоновым кешем и системой опроса, чтобы поддерживать его обновление, было бы лучше, так как ваш клиент всегда получал самую свежую информацию сразу. Кэш и обновление могут поддерживаться рядом различных решений, но ваш клиент будет видеть только стандартный веб-сервис.

Вы можете улучшить его, добавив меньший интерфейс в качестве части веб-службы, чтобы клиент мог проверить, есть ли обновление перед загрузкой. Размер загрузки смещает округление, чтобы проверить обновление.

0

IIS предназначен для обработки HTTP-соединений, и они, как правило, недолговечны. Чтобы сделать это, вы должны регулярно проверять сервер на сервере.

0

Полный пример того, как этого добиться ...

using System 
using Core.Services; 
using System.Threading.Tasks; 
using System.Web.Hosting; 

public interface IISHostedProcessService : IRegisteredObject, IDisposable 
{ 
    Task Start(); 
} 

public class CoreHostedProcess : IISHostedProcessService 
{ 
    protected bool running; 

    public CoreHostedProcess() 
    { 

    } 

    public virtual Task Start() 
    { 
     return Task.Run(() => 
     { 
      running = true; 
      HostingEnvironment.RegisterObject(this); 
     }); 
    } 

    public virtual void Stop(bool immediate) 
    { 
     running = false; 
     HostingEnvironment.UnregisterObject(this); 
    } 

    public virtual void Dispose() 
    { 

    } 
} 

Хорошо, что это основной материал определен, теперь мы определим размещаемой процесс, чтобы сделать что-то полезное, как гм, запускать задачи по расписанию ...

using log4net; 
using System.Threading.Tasks; 
using System.Timers; 
using System; 
using Core.Utilities.Objects.Entities; 
using System.Linq; 
using System.Net.Http; 
using Core.Objects; 
using Ninject; 


public class TaskScheduler : CoreHostedProcess 
{ 
    static readonly ILog log = LogManager.GetLogger(typeof(TaskScheduler)); 
    Timer timer = new Timer(60000); 
    IKernel kernel; 

    public TaskScheduler(IKernel kernel) : base() 
    { 
     this.kernel = kernel; 
    } 

    async void RunTasks(object sender, ElapsedEventArgs e) 
    { 
     //TODO: write code to fetch tasks and run them 
    } 

    public override async Task Start() 
    { 
     log.Info(" Initialising Task Scheduler."); 
     timer.Elapsed += RunTasks; 
     RunTasks(null, null); 
     timer.Start(); 
     await base.Start(); 
    } 

    public override void Stop(bool immediate) 
    { 
     log.Info(" Stopping Task Scheduler."); 
     timer.Stop(); 
     base.Stop(immediate); 
    } 
} 

Хорошо, теперь использовать размещенный процесс ...

в IIS, в приложениях расширенные настройки набор «преднагрузки поддержкой» истинно, чтобы обеспечить приложение постоянно находится на сервере аф начальная нагрузка.

Когда приложение нагрузки, например, если с помощью Owin/в старой школе глобального файла asax вы можете добавить следующее ...

public class Startup 
{ 
    static readonly ILog log = LogManager.GetLogger(typeof(Startup)); 
    public static IKernel Kernel { get; private set; } 
    static List<IISHostedProcessService> hostedProcesses = new List<IISHostedProcessService>(); 

    public void Configuration(IAppBuilder app) 
    { 
     hostedProcesses.Add(new TaskScheduler()); 
    } 
} 

Теперь вы должны иметь все, что нужно как определить и инициализировать TaskScheduler изнутри размещенного в IIS приложения C# я создал API для управления данными задачи с использованием OData, который находится поверх моего управляемого EF db, чтобы я мог CRUD управлять набором задач в системе.

После развертывания я считаю, что мне нужно ударить приложение хотя бы один раз, просто сделав запрос на него (любой URL-адрес), после загрузки IIS продолжит работу (таким образом, ваш хостинг-процесс будет запущен) до тех пор, пока вы не остановите приложение IIS который размещает этот процесс.

Когда приложение остановлено, на ваши размещенные процессы вызывается метод Stop, который «отменяет регистрацию хост-процесса» и удаляет его на сервере, тем самым связывая хостинг-процесс с жизненным циклом приложений IIS.

Я подумал, что слишком много для публикации кода OData и EF. Надеюсь, это должно сделать.

Смежные вопросы