2009-10-19 8 views
1

몇 가지 두통을주는 디자인 시나리오가 있는데 어떤 솔루션이 가장 좋은 솔루션인지 궁금합니다.IIS에서 장기 실행 프로세스 호스팅

실시간 데이터를 수집하기 위해 Java RMI 연결이 필요한 서비스의 정보를 폴링하는 대시 보드와 유사한 응용 프로그램이 있습니다. Silverlight에서 해당 대시 보드 구성 요소를 구현하고 WCF를 사용하여 데이터를 제공하고 싶습니다.

저는 과거에는 .net Remoting 및 Windows 양식을 사용하여이 문제에 대한 솔루션을 설계했습니다. 이전의 디자인은 Windows 서비스 였지만 IIS의 응용 프로그램처럼이 서비스를 호스트 할 수있는 방법이 있는지 궁금합니다.

는 는

서비스는 필요 -> 열기 RMI 연결 (이 내가 iKVM을 함께했던) - >를 정기적으로 데이터를 가져 -> 업데이트 클라이언트 새로운 데이터가 도착했습니다 (옵저버 패턴)

수 내 데이터 수집 클래스의 싱글 톤 인스턴스를 구현하고 옵저버를 등록합니까? 윈도우 서비스에서 WCF를 호스팅해야합니까? 다른 아이디어?

답변

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() 
    { 

    } 
} 

확인 핵심 물건 정의 된 사용자들은, 이제 우리는 일정에 따라 음과 같은 실행 작업 유용한 일을 할 수있는 호스팅 프로세스를 정의 ...

고급 설정은 응용 프로그램을 보장하기 위해, true로 "프리로드 가능"으로 설정 응용 프로그램 내에서 호스팅 프로세스를 사용하는 지금 확인
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에서

은 후 서버에로드 된 상태로 유지 초기 하중.

예를 들어, 응용 프로그램로드 오래된 학교 글로벌 asax 파일에/owin 사용하는 경우는 다음을 추가 할 수 있습니다

...
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# 응용 프로그램 내에서 EDF 관리 데이터베이스의 맨 위에있는 OData를 사용하여 작업 데이터를 관리하기위한 API를 만들었 기 때문에 CRUD가 시스템의 작업 집합을 관리 할 수있었습니다.

배포 한 후 IIS 응용 프로그램을 중지 할 때까지 단순히 IIS에 요청을 보내서 IIS를 실행 한 상태로 유지하므로 (호스트 된 프로세스가 계속 실행 됨) 응용 프로그램을 한 번 이상 실행해야한다고 생각합니다. 프로세스를 호스팅합니다.

응용 프로그램이 중지되면 호스트 된 프로세스의 "등록을 취소하고"이를 서버에 폐기하여 호스트 된 프로세스를 IIS 응용 프로그램 수명주기에 연결하는 호스트 된 프로세스에서 Stop 메서드가 호출됩니다.

나는 OData와 EF 코드를 게시하는 것이 너무 많을 것이라고 생각했다. 잘하면이해야합니다.

관련 문제