2012-02-08 2 views
2

는 TL; DR 버전 :ASP.NET 페이지와 Windows 서비스간에 드문 메시지를 효율적으로 전달하는 방법은 무엇입니까?

승 Windows 서비스에 메시지를 추진하는 aspx 페이지에 대한 쉬운 방법/서비스를 지속적으로 폴링 공유 자원 (예를 들어, 데이터베이스 테이블)에서 있습니까?

는 TL을,하지만이-I는 읽기 - 그것 - 어쨌든 버전 : 나는 매우 긴 실행중인 프로세스를 구현하는 ASP.NET 웹 응용 프로그램을 가지고

합니다. 나는 응용 프로그램 풀 재활용 및 시간 초과 요청으로 인한 부수적 인 문제를 해결하는 일반적인 방법은 IIS 외부에서 장기 실행 프로세스를 처리 할 수있는 Windows 서비스를 만드는 것임을 이해합니다.

저는 ASP.NET에 익숙하며 간단한 Windows 서비스를 작성한 적이 있습니다. 그러나 웹 페이지와 Windows 서비스간에 메시지를 가장 잘 전달하는 방법에 대한 조언을 사용할 수 있습니다.

명백한 쉬운 해결책은 공유 데이터베이스를 사용하는 것입니다. 웹 페이지는 "작업"테이블에 요청을 작성하고 서비스는 해당 테이블을 모니터링하여 작업을 처리 할시기를 알 수 있습니다. 그러나, 그게 내 애플 리케이션이 사용되는 방식에 잘 맞는 지 모르겠다.

이 앱은 기본적으로 홉업 된 이메일 뉴스 레터 우편물입니다 (일반적인 SMTP 편지 병합보다 속도가 느려지는 경우가 있습니다). 평균적으로 며칠에 한 번씩 사용되며 일반적인 사용 사례는 여러 개의 짧은 이메일 작업을 보낸 다음 하나 또는 두 개의 긴 작업을 보내는 것입니다. 따라서 Windows 서비스를 옮기고 자하는 "이메일 전송"코드는 몇 초에서 최대 20 분 (및 성장)까지 실행할 수 있습니다.

규모가 짧은 웹 응용 프로그램의 경우 응답 속도가 느리므로 서비스가 데이터베이스를 몇 초마다 폴링하여 사용자가 작업을 시작하는 데 오래 기다리지 않도록해야합니다. 실행하는 데 걸릴 것입니다. 하지만 앱이 전혀 사용되지 않는 시대의 데이터베이스에는 쓸모없는로드가 많이 발생합니다.

System.Diagnostics.Process를 사용하여 aspx 페이지에서 콘솔 응용 프로그램을 실행하는 예제를 보았습니다. 콘솔 응용 프로그램을 실행하면 내 응용 프로그램이 실제로 어떻게 사용되는지 (콘솔 응용 프로그램에 메일 코드를 넣는 경우) ,하지만 나는 그것을 IIS 프로세스에서 꺼내지 않을 것이라고 생각합니다.

내 질문에 종기가 : 웹 페이지에 대한 메시지를 밀어 (또는 그렇지 않으면 반응을 유발할 수있는) 쉬운 방법은 Windows 서비스 승/공유 서비스를 지속적으로 폴링하는 Windows 서비스 (예 : 데이터베이스 표)? 아니면 내가 생각하는 것보다 적은 수의 폴링 폴링이 문제가 될까요?

세부 정보 : 웹 응용 프로그램은 3.5 프레임 워크를 대상으로하며 이전 백도어 IIS 6 상자에서 실행됩니다. 내 연구에서는 MSMQ에 대한 정보를 WCF/WAS, 심지어 .NET Remoting으로 돌 렸습니다. 그러나이 모든 문제는 과도한 느낌으로이 문제에 대한 충분한 시간을 갖게되었습니다. 무언가를 새 것으로 파싱하고 비교할 수는 없습니다. 셋 (또는 너무 많은 시간을 구글 토끼 구멍에 쏟아 붓는다).

저는 IIS 프로세스에서 일부 코드를 이동시키는 간단한 방법을 찾고 있습니다.

답변

1

글쎄, WCF는 정말 간단한 솔루션이며,이 정확한 목적을 위해 ASP.NET 응용 프로그램을 사용하고 있습니다. 뉴스 레터 서버 - 뉴스 레터를 보내는 Windows 서비스입니다. 나는 performace에 어떤 문제도 전혀 가지지 않았다.여기에 간단한 WCF IPC의 좋은 예입니다

http://www.switchonthecode.com/tutorials/wcf-tutorial-basic-interprocess-communication

업데이트 : 내 예를 들어, Windows 서비스에서 서버이며, ONSTART에서 나는 이런 식으로 뭔가 (예를 단순화)하고있는 중이 야 :

protected override void OnStart(string[] args) 
{ 
    host = new ServiceHost(typeof(NewsletterNotifier), new Uri[]{ new Uri("net.pipe://localhost") }); 
    host.AddServiceEndpoint(typeof(INewsletterNotifier), new NetNamedPipeBinding(), "PipeNewsletterNotifier"); 
    host.Open(); 
} 

(OnStop 서비스 이벤트에서 호스트를 닫고 일시 중지 한 후 계속 처리해야합니다.)

그리고 ASP.NET 응용 프로그램이 뉴스 레터 서버의 일부 서비스를 제공하지 않을 때 INewsletterNotifier에서) :

ChannelFactory<INewsletterNotifier> pipeFactory = new ChannelFactory<INewsletterNotifier>(new NetNamedPipeBinding(), new EndpointAddress("net.pipe://localhost/PipeNewsletterNotifier")); 
INewsletterNotifier pipeProxy = pipeFactory.CreateChannel(); 
pipeProxy.DoSomething(); 
+0

안토니오 감사합니다. WCF 서버를 Windows 서비스로 실행할 수 있다고 말합니까? IIS에 대한 의존성이 있습니까? 내가 WCF/WAS (기술적 인 세부 사항을 파헤치는 중)에 대해 읽은 다른 것들 중 일부는이 프로젝트에서 IIS 6을 사용하는 동안 인생이 훨씬 쉬워 질 것이라고 암시했다. – Matt

+0

예 서버가 Windows 서비스에 있고, WCF ServiceHost가 Windows 서비스 OnStart에서 인스턴스화되고 ASP.NET 응용 프로그램이 클라이언트입니다. 두 응용 프로그램 모두 동일한 서버에 있으므로 명명 된 파이프를 전송으로 사용하고 있습니다. 나는이 세부 사항들로 나의 대답을 업데이트 할 것이다 –

+0

설명과 추가 사항에 감사드립니다. 그 링크의 내용과 관련된 발견 다른 것들과 jibes, 그리고 빠른 프로토 타입을 시작 날을 충분히해야합니다. 일단 내가 끝내면 따라 할게. – Matt

3

어때 대략 MSMQ? 확실하게 전달할 전자 메일 메시지를 받고 서버는 대기열에서 원하는 빈도를 읽습니다.

그것은 설치 정말 간단합니다

  • 가 MSMQ를 설치
  • (개인 큐는 도메인에있는 모든 컴퓨터에 복제되지 않음) QueueExplorer 보려는
  • 이 도구를 사용하여 개인 큐 만들기 다음은 몇 가지 매우 빠르고, 유엔의

- 메시지, 또는이 MMC 인터페이스에 내장 된 (> 서비스 및 응용 프로그램 ->를 메시지 큐를 마우스 오른쪽 단추로 내 컴퓨터를 클릭> 관리) 테스트 코드을 예로들 수 있습니다. 필요한 경우 메시지에 대한 자체 포맷터를 만들고 메시지에 중복성이 필요한 경우 트랜잭션을 사용할 수 있습니다.

// System.Messaging.Dll 
// The ASP.NET sends the messages to MQ: 
using (MessageQueue queue = new MessageQueue(@"computername\private$\test", QueueAccessMode.Send)) 
{ 
    using (Message message = new Message()) 
    { 
     message.Priority = MessagePriority.Normal; 
     message.Label = "A label"; 
     message.Body = "<content>The email message</content>"; 

     message.UseDeadLetterQueue = false; 
     message.Recoverable = false; 
     message.Formatter = new XmlMessageFormatter(); 

     queue.Send(message); 
    } 
} 

// The service reads the queue in a loop: 
// (more sophisticated than this) 
MessageQueue queue = new MessageQueue(@"computername\private$\test", QueueAccessMode.SendAndReceive); 
queue.Formatter = new XmlMessageFormatter(); 
Message message = queue.Receive(); 
string xml = (string)message.Body; 
+0

지금까지 MSMQ에 대해 읽은 내용을 보면 제 목적이 과도하다고 생각합니다. 나는 그것을 정말로 자극하지 않는다는 것을 인정할 것이다. 그러나 그것은 나의 작은 app을위한 오버 헤드와 같이 보인다. – Matt

+0

@Matt MSMQ는 사용하기가 매우 쉽고 정확히 원하는대로 작동합니다. 메시징은 직선 서비스 호출보다 바람직합니다. 왜냐하면 두 구성 요소에 동시에 의존하지 않기 때문에 특히 장기간 실행되는 프로세스는 대기 시간을 갖고 대기 할 수 있고 실행될 수 있기 때문입니다. 그 중에서도 메일 앱이 충돌 할 경우 백업 할 때 마지막 작업을 다시 시작할 수 있으므로 오류가 많이 발생하는 경향이 있습니다. –

+0

@Matt 생각보다 훨씬 간단합니다. 내 대답을 업데이트했습니다. –

관련 문제