2009-11-11 3 views
2

Windows 서비스가 C# .NET Framework 3.5로 작성되었으며 이전 서비스 종료가 정기적인지 확인하는 가장 좋은 방법을 알고 싶습니다.Windows 서비스가 강제로 종료되었거나 충돌했는지 확인하십시오.

서비스를 시작할 때 마지막 종료가 정기적 인 경우 (서비스 관리에서 서비스 중지 버튼을 통해) 또는 누군가가 프로세스를 종료 한 경우 (또는 서비스 자체에 직접 연결되지 않은 이유로 인해 충돌 한 경우)).

서비스 시작시 하드 드라이브에 암호화 된 XML을 쓰고 서비스가 중지 될 때 일부 값으로 편집하는 방법에 대해 생각했습니다. 그런 식으로 다음에 서비스를 다시 시작한 후 XML을 검사하여 종료하는 동안 값이 올바른 방식으로 편집되었는지 확인할 수 있습니다. 그렇지 않은 경우 프로세스가 종료되거나 충돌이 발생했는지 알 수 있습니다.

이 방법은 너무 신뢰할 수없고 좋은 방법이 아닙니다. 너는 무엇을 제안 하는가?

설명 : 서비스는 서버에 앉아 클라이언트 시스템의 연결을 수신 대기합니다. 연결이 설정되면 웹 서비스를 통해 원격 데이터베이스와 통신하고 연결 권한이 있는지 (따라서 호출자 인 응용 프로그램을 사용하는지)를 결정합니다. 보호 측면 중 하나는 동시성 검사이며 5 워크 스테이션으로 제한이 설정되어있는 경우 Windows 서비스의 TcpClient 연결을 유지하고 5 대의 워크 스테이션을 연결하고 6 번째 워크 스테이션은 연결할 수 없습니다.

서비스 프로세스를 종료하고 다시 시작하면 연결이 끊어지고 워크 스테이션에서 5 개의 "라이센스가 부여 된"응용 프로그램이 실행되며 5 개의 무료 연결 슬롯이 5 개 더 추가됩니다.

+0

WebService에서 확인 할 수없는 이유는 무엇입니까? – Arthur

답변

2

나는 이것과 함께 끝까지 갔다. 서비스는 연결된 워크 스테이션에서 살아 있는지 확인하는 데 사용되었지만 이제는 모든 워크 스테이션의 정기 검사를 구축했다. 내가 체크에서 만들었던 일반적인 라우터 dll). 매 10 초마다 연결이 확인되고 아무 것도없는 경우 클라이언트는 15 초 후에 다시 연결을 시도합니다. 일시적인 네트워크 문제 만있는 경우에는 성공하지만 서비스가 강제 종료 된 경우에는 실패합니다 (모든 그것은 Tcp 개체가 손실됩니다).

0

서비스가 "tamper"증명 시스템이 있어야하는 일종의 securiy 시스템을 실행하지 않는 한 파일을 사용하는 것이 왜 나쁜 해결책인지는 알 수 없습니다.

Personality 나는 encrpted XML 파일이 과잉이라고 생각합니다. 간단한 텍스트 파일로 충분할 것입니다.

+0

죄송합니다. 파일을 마커로 사용하는 것이 좋다고 생각하지 않는 이유는 분명하지 않습니다. 서비스는보다 강력한 보안 시스템의 일부이며 위조 방지 솔루션이 필요합니다. –

0

당신이 올바른 길을 가고 있다고 생각합니다. 왜 파일을 편집하고 싶은지 잘 모르겠습니다. 파일 (또는 레지스트리 키)을 마커로 사용하여 서비스가 시작되었고 실행 중임을 나타냅니다. 정상적인 종료 중에 마커를 제거하십시오. 그런 다음 마커가 정상적으로 종료되었는지 또는 충돌했는지 여부를 확인하기 만하면됩니다.

파일을 안정적으로 만들지 못하는 경우 가비지 수집기에 의존하는 대신 파일 개체를 닫고 플러시 및 삭제해야합니다.

--- EDIT 다음 설명 ---

그래서 요구 사항은 라이센스 시스템과 서비스가 종료가 정상적으로 있다면 간단하게 결정하지. 나는 추측하고있다. '라이센스'가 정상적인 종료에서 지워지고 충돌 후에 복원되는 것이지, 시나리오는 상호 교환 가능하다.

적절한 보안 기능을 갖춘 데이터베이스 백업 저장소를 사용하여 서버에서 라이센스 키를 보관할 수 있습니다. 각 클라이언트가 연결하고 라이센스를 요청할 때 클라이언트에서 각 통신에 대해 제시해야하는 키가 제공됩니다. 서버는 제시된 키가 현재 세션에 대해 유효한지 여부를 분명히 확인합니다. 서버가 정상적으로 종료되면 키 테이블을 지울 수 있습니다. 충돌이 발생해도 키는 계속 나타나고 존중할 수 있습니다. 아마도 이것이 내가 생각할 수있는 가장 간단한 접근 방법 일 것입니다.

아직 더 많은 이야기가 있다면 알려주세요.

+0

간단한 마커는 정기적으로 종료 한 후 복사 한 다음 강제 종료 한 후에 다시 바꿀 수 있으므로 이전 종료와 관련하여 아무 문제가 없다는 것을 다시 시작한 후 서비스로 보일 수 있습니다. 원래 게시물의 서비스 기능에 대해 명확하지 않은 점에 대해 사과드립니다. –

1

EventLog을 사용하는 것이 좋습니다. 서비스가 시작되거나 중지 될 때 로그 이벤트를 추가하고 이벤트 로그를 통해 오류를 감지하여 예외를 감지합니다.

여기에 CodeProject의 기본 샘플이 있습니다. 여기에 walkthrough from MSDN 이벤트 로그 및 항목을 생성/삭제/읽는 방법이 있습니다.

+1

팁 주셔서 감사하지만, 나는이 아이디어를 포기했습니다. –

2

나는 또한 파일을 사용하여 아무것도 볼 수 없습니다. 이 파일을 사용하여 더 많은 정보를 기록 할 수도 있습니다.

예 : AppDomains Unhanded Exception 이벤트에 연결하여 해당 예외를 기록 할 수 있습니다. 또는 서비스가 실행 중이거나 실행되고 있지 않음을 평가할 수 있습니다 (해당 작업에 대한 로그 파일 구문 분석이 조금 더 어렵습니다).

물론 이것은 로그 파일을 사용하지 않는 핑계가 아닙니다.

+0

이것은 부정을 검사하는 좋은 방법이기도하지만 결국 다른 경로를 선택했습니다. –

관련 문제