2009-12-01 2 views
1

웹 서비스를 구현하기 위해 WCF를 사용하고 있습니다. 이 웹 서비스에는 각 서비스의 상태 모니터로 '핑 (ping)'기능이 필요합니다. 이 기능은 IDispatchMessageInspector를 사용하여 구현되었으며 서비스의 각 끝점에 대해 구성됩니다. 이는 '핑 (ping)'이 실제 서비스 코드와 거의 같아야한다는 비즈니스 요구 사항 때문입니다. 동시에, 나는 각 서비스 구현 코드와 IDispatchMessageInspector를 묶는 것을 원하지 않았다.메시지 검사기를 사용하여 'Ping'기능을 구현하면 WCF 런타임이 NullReferenceException을 발생시킵니다.

이 서비스는 요청 - 응답 MEP를 사용합니다. 각 요청 메시지는 필요한 처리를 지정하는 요소를 포함합니다. 그러면 서비스에서이 값을 사용하여 메시지에서 데이터를 처리하는 방법을 결정합니다. 동일한 요소가 요청 메시지를 '하트 비트'확인으로 정의하는 데 사용됩니다.

'ping'메시지 검사기는 AfterReceiveRequest() 메소드에서 요청 메시지를 사전 처리하고 요청이 '하트 비트'라고 판단하면 올바른 응답을 생성하여 BeforeSendReply () 메소드에서 AfterReceiveRequest()에서 리턴 된 상관 오브젝트를 통해 리턴됩니다. 참조로 된 AfterReceiveRequest()의 요청 메시지 매개 변수는 서비스 구현 코드에 의해 메시지가 처리되지 않도록 null로 설정됩니다.

요청 메시지를 null로 설정하는 기술은 내가 기억할 수없는 웹 사이트 또는 블로그에서 찾거나 URL을 찾을 수 없습니다. 이 기술은 자체적으로 훌륭하게 작동하며 '하트 비트'요청 인 경우 서비스 구현 코드가 실행되는 것을 방지 할 수 있습니다.

불행히도 메시지 관리자에서 요청 메시지를 null로 설정하면 WCF 런타임에서 항상 NullReferenceException을 throw합니다. 스택 트레이스에서 런타임이 여전히 디스패처로 'Ping'메시지 관리자를 통과 한 후 null이 될 메시지 객체를 전달하고 디스패처가 null 메시지 객체를 deserialise하려고하면 NullReferenceException이 발생합니다.

그러나 내 시스템은 IErrorHandler를 구현하여 서비스의 처리되지 않은 예외를 캐치하고이를 기록합니다. 이것은 모든 성공적인 '하트 비트'요청이 NullReferenceException에 대한 로그 항목을 생성하고 '하트 비트'가 매분마다 자주 발생할 수 있음을 의미합니다.

[질문 : 내가 던진 '쓸모없는'NullReferenceException이 로깅을 방지하기 위해 할 수있는 일

때 null로 요청을 설정하여 실행에서 '핑'을 방지 서비스 구현 코드입니다.

미리 감사드립니다.
~ HG

답변

0

아니 가장 우아한 해결책하지만 잠재적 인 해결 방법 (내가 테스트하지 않았으므로),하지만 당신은 당신이 당신의 자신의 사용자 정의 예외 유형을 던질 수 없었다, 당신의 핑은 관리자 코드에서 호출 감지 즉 PingRequestException하고, 이것이 클라이언트에게 돌아 왔을 때 이것을 처리합니까? WCF 런타임 코드를 치지 않으므로 처리되지 않은 예외를 기록하지 않아도됩니다.

그렇지 않으면 실제 서비스 코드를 치기 전에 생성자에서 ping 요청을 감지하고 처리하는 모든 서비스 (wcf 런타임 코드의 반대쪽)에서 상속 된 기본 서비스를 사용하려고 할 수 있습니다.

+0

감사합니다. Tanner, 불행히도 추가 합병증이 있습니다. Ping 코드를 기본 서비스 클래스에 넣지 못하도록하는 다른 고려 사항이 있으므로 옵션 2는 적용 할 수 없습니다. 옵션 하나는 작동하지 않을 수 있습니다. 그런 다음 로그되는 예외를 필터링 할 수 있습니다. 그러나 분당 1 회 또는 더 자주 '핑 (Ping)'을받을 수 있습니다. 그 많은 예외를 던지면 성능에 심각한 영향을 미치지 않을까요? –

+0

예외를 올바르게 처리하면 성능에 영향을 미치지 않습니다. 메시지 검사기를 능가하는 현재 구현보다이 시나리오를 더 빨리 처리해야합니다. 요구 사항이 허용되면, 나는 enpoint 커플 링을 제거하고 빈 구현 서버 측을 가진 전용 핑 서비스를 생성합니다. 이 서비스는 모든 바인딩/구성을 사용하여 다른 서비스의 설정과 가깝게 유지할 수 있지만 예외를 방지하거나 오류율을 높일 수있는 메시지를 수정하지 않아도됩니다. 나는 이것이이 방법으로 훨씬 더 깨끗하게 될 것이라고 생각한다. – Tanner

+0

불행히도 비즈니스 요구 사항에 따라 엔드 포인트 커플 링을 제거 할 수 없습니다. 본질적으로 핑 기능은 모든 비즈니스 운영에 필요합니다. 즉 웹 서비스의 URL을 변경하지 않아도됩니다. 내가 알기에 엔드 포인트 특정 확장 또는 서비스 구현 자체에 모든 작업 코드에서 사용하도록 제한하는 것이 상당히 제한적입니다. ping을 포함하는 '기본'서비스 구현을 사용하는 것이 좋았 겠지만 지금은 변경할 수 없습니다. PingRequestException 메서드에 시도해 보겠습니다. –

관련 문제