2011-02-24 7 views
1

나는 WCF netNamedPipeBindingwsHttpBinding을 사용합니다. 단방향 방법이 try없이 성공적으로 실행될 수 있는지 알고 싶습니다.try-catch없이 WCF 연결을 검색하는 방법은 무엇입니까?

EDIT 누구나 언급했듯이, conectivity는 주어진 순간을 성공하고 다음 순간에는 실패 할 수 있습니다. 나는 상관 없다. WCF가 try ing에 대한 대안을 갖고 있는지 알고 싶습니다. 서비스가 정상적으로 작동하는지 확인하는 방법이 있습니까?

+0

좋아요, 그럼 방법이 지금이라면. 그래서 당신은 그 방법을 부르지 만, 그 동안 그 방법은 사라졌습니까? 응용 프로그램을 단순히 중단 시키거나 try/catch 블록을 사용합니까? –

+0

처음 코멘트에서 업데이트를 확인하십시오. 서비스의 현재 상태를 결정할뿐만 아니라 오류 상태 알림을 다룹니다. – VulgarBinary

답변

5

단 한 가지 방법이 성공적으로 실행되었는지 여부를 판단하는 유일한 방법은 예외를 생성하는지 여부입니다.

메서드가 단방향 메서드가 아니어도 메서드가 실패했는지 성공했는지 여부를 나타내는 부울 값을 반환 할 수 있습니다.

내가 왜이 작업을 수행하려고하는지 묻습니다. 메소드에 대한 예외를 포착하지 않으면 예외가 발생할 경우 오류 조건을 알릴 수 없습니다.

"try it"사용에 대해 오해하고 실제로이 메서드를 실행하지 않고서도 작업을 커미트하지 않는 메서드에 대한 프록시를 작성할 수 있습니다. 처리 단계 만 수행합니다.

전체 테스트 목적으로이 작업을 수행하는 경우 Visual Studio 유닛 테스트를 활용하거나 프로젝트를 NUnit으로 배선하는 것이 좋습니다.

위의 사항 중 하나가 귀하의 질문에 답변하지 못한 경우 수행하고자하는 사항에 대해 자세히 알려주십시오.

편집 : Asker에 의한 설명을 위해 수정 됨.

using(YourService svc = new YourService()){ 
    if(svc.State.Equals(!CommunicationState.Opened)){ /*Handle Error*/ } 
    svc.InnerChannel.Faulted += new EventHandler(YourFaultedEventHander); 
} 

연결이 현재 열려 있는지 확인하고 서비스가 오류 상태 인 경우 /에 알려줍니다. 이렇게하면 호출이 성공할지 여부를 미리 알 수 있습니다. 그러나 특정 메서드가 실패 할 수있는 조건이 여전히 있습니다.이 메서드는 성공적으로 서비스 메서드를 호출 할 수있는 경우에만 알려줍니다.

+0

서비스가 작동 중인지 여부와 클라이언트와 서비스간에 연결이 있는지 알고 싶습니다. –

+0

완벽 한 탐험 지금, 초기 게시물에 있었으면 좋겠다. 그리고 나는 처음에 위의 편집에서 게시 한 내용에 응답 할 수 있었다 ;-) – VulgarBinary

2

의 단방향 작동이 성공할 수 있는지 여부를 알 수있는 방법이 없습니다. 단방향 작업 (AFAIK)은 모든 바인딩에서 지원됩니다.

호출이 단방향 오퍼레이션인지 단순히 확인하려면 서비스 설명 작업을 반복해야합니다 (클라이언트 또는 서버 측 호출인지 여부를 표시하지 않음). 작업이 편도인지 아닌지 살펴보십시오.

+0

작업이 단방향인지 미리 알 수 있습니다. 방금 서버가 예외를 던진 것이 아니라 연결에 신경을 써서 단방향으로 언급했습니다. –

+1

@ Jader Dias : 전화를 걸지 않고도 말할 수 없습니다. WCF에는 "ping"기능이 내장되어 있지 않습니다.호출하기 전에 프록시에서'Open' 메소드를 호출 할 수 있습니다. 그러나 바인딩에 따라 호출이 다른 것을 의미 할 수 있습니다. 호출이 보장하는 유일한 것은 프록시가 메시지를받을 수 있다는 것입니다. – casperOne

+0

그건 완전히 사실이 아닙니다. 그렇습니다. 오픈 콜은 바인딩에 따라 다른 의미를 가질 수 있습니다. (Jader가 어떤 바인딩을 사용하는지 질문하는 것이 적절합니다.) 전화를 걸지 않고 서비스 클라이언트에 대해 더 많이 알 수 있습니다. 오류 이벤트 (클라이언트 채널의 경우가 지정된 호출 이전에 손상된 경우)와 채널이 현재 열려 있는지 여부를 확인하는 이벤트가 있습니다. 당신이 말한대로 프록시가 요청을받을 준비가되었음을 보장 할 뿐이지 만, 여전히 통화를 보지 못하게하는 것 이상의 상태를 서비스에 제공합니다. – VulgarBinary

4

통화를 테스트하면 통과하고 어떻게 든 연결이 끊어지고 다음 코드 블록이 실패합니다. try 해제하는 것이 더 나을 것입니다. 그런 다음 /가 나타나면 오류를 처리하십시오.

+3

누군가가 마침내 질문을 이해했습니다. –

+2

나는 항상 잡기와 함께 서비스 호출을 처리해야한다는 데 동의하지만, 서비스의 현재 상태뿐만 아니라 캡처 할 이벤트를 결정할 수있는 방법이 있습니다 오류 상태. 어쨌든, 당신은 {...} catch (..) {...} 당신의 코드가 얼마나 많은 코드인지 상관없이 항상 서비스를 요청해야합니다. – VulgarBinary

+0

@ JaderDias 커뮤니티에서 질문을 이해하는 데 어려움이있는 경우 질문이 커뮤니티에 적합하지 않을 수 있다고 생각하십시오. – Gusdor