2010-03-07 4 views
1

Silverlight 응용 프로그램 내에서 비주얼 스튜디오에서 생성 한 클라이언트를 사용하여 비동기 적으로 웹 서비스를 호출합니다 (서비스 참조 추가 ...). "Silverlight 및 WCF : 'WCF down'예외/WCF 연결 검사 처리

private void Application_UnhandledException(object sender, ApplicationUnhandledExceptionEventArgs e) 

:

ServiceClient serviceClient = new ServiceClient(); 
serviceClient.GetServerTimeCompleted += new EventHandler<GetServerTimeCompletedEventArgs>(serviceClient_GetServerTimeCompleted); 
serviceClient.GetServerTimeAsync(); 

void serviceClient_GetServerTimeCompleted(object sender, GetServerTimeCompletedEventArgs e) 
{ 
     // do nothing atm 
} 

모든 것이 한 서비스가 실행처럼 잘 작동하지만 서비스가 실행되지 않을 때, 내가 얻을 :
내 코드는 다음과 같습니다 작업 중에 예외가 발생하여 결과가 유효하지 않습니다. 예외에 대한 InnerException을 확인하십시오. " ': // HTTP'.이 때문에 상호에 서비스 에 액세스하려고에 을 수의 InnerException

는 "오류가 하려고하는 URI에 을 요청을하는 동안 발생한 적절한 도메인 간 정책을 사용하지 않는 도메인 방식 또는 SOAP 서비스에 적합하지 않은 정책이있는 경우 서비스 소유자 인 에 연락하여 도메인 간 정책 파일을 게시하고 ens 을 사용하면 SOAP 관련 HTTP 헤더를 으로 보낼 수 있습니다. 이 오류는 InternalsVisibleToAttribute 특성을 사용하지 않고 웹 서비스 프록시의 내부 형식을 사용하여 이 발생할 수도 있습니다. 그것은 내가 이러한 상황에서 예외가 의미가

". 자세한 내용은 내부 예외를 볼 수 있지만, 내가 무엇을 알아낼 수있는 것은 내 클라이언트 코드에서 예외를 catch하는 방법입니다하시기 바랍니다.인가 이 작업을 수행하는 표준 방법이 있습니까? 어떻게 작동하는지 이해하면 내 코드에서 생성 된 코드를 호출 할 때 실제로 웹 서비스를 호출하고 응답을 기다리는 다른 스레드가 생성됩니다. 예외는 해당 스레드와 생성 된 스레드입니다 내 호출 코드 (위 참조) 나 콜백 메소드 모두 예외를 볼 기회가 없습니다.

감사합니다.

기독교

답변

1

Visual Studio에서 "서비스 참조 추가"기능을 사용하지 않는 데는 여러 가지 이유가 있습니다. 다음은 문제에 대한 좋은 (그리고 긴) 기사이며 how to use WCF creating your clients입니다. 나는 지금 당장이 문제들을 해결하려고 노력하고있다.

"서비스 참조 추가"에 대한 우려로는 다운로드 가능한 클라이언트 .XAP 파일에 코드가 부풀어 오르고, 생성 된 코드를 유지하는 데 어려움이 있으며, 서버 주소 및 포트가 클라이언트 구성에 하드 코드 된 경우 준비 또는 배송 코드에 어려움이 있습니다. 파일 (.XAP에도 임베드 됨), 기타 등등. 자신 만의 클라이언트를 구축하면 클라이언트 코드에서 예외를 관리하는 기능이 향상됩니다.

몇 가지 단점이 있습니다. 데이터 계약 클래스를 Silverlight 환경으로 이식 할 수 있어야합니다. (서버 측 .NET 어셈블리에 대한 참조 만 추가 할 수는 없으며 작동하지 않습니다.) 위에서 링크 된 동일한 사이트에는 re-using assemblies in Silverlight에 관한 좋은 기사가 있지만 가장 쉬운 방법은 Silverlight 프로젝트의 서버 측 클래스에 링크를 추가하는 것입니다. Silverlight 프로젝트에서 마우스 오른쪽 단추로 클릭하고 추가 -> 기존 항목 추가 ...를 클릭하고 포함 할 항목을 찾으십시오. 추가 단추를 클릭하는 대신 옆에있는 아래쪽 화살표를 클릭하고 "다른 이름으로 추가"를 클릭하십시오. Link "를 참조하십시오.) 다른 참조 및 서버 측 클래스를 참조하는 명령문 사용에주의하십시오. 클라이언트 측 프로젝트에서 데이터 계약 클래스를 깔끔하게 컴파일 할 수 있도록 조건부 컴파일을 수행해야 할 수도 있습니다.

전반적으로 볼 때, 실제로는 훨씬 더 깨끗한 방법입니다. 특히 많은 서비스 계약 및 데이터 계약을 사용하는 대규모 프로젝트의 경우 또는 Silverlight 프로젝트를 다른 응용 프로그램에서 실행되는 상용 응용 프로그램의 일부로 제공해야하는 경우 사람들의 서버. 특히 통합 및 스테이징 테스트의 경우 테스트 가능성을 위해 훨씬 더 깨끗해야합니다.

+0

감사

, 나는이 페이지에 파고 것입니다. Add Service Reference를 사용하면 매우 편리합니다. 시간이 없습니다. –

0

이 문제가 발생하기 전에 - ServiceClient 설치 코드 주위에 예외 처리 코드를 추가해야합니다. 나는 일반적으로 다음 CommunicationException, TimeoutExceptionEndpointNotFoundException를 확인하고 그들에게 뭔가 고장 말하는 적절한 대화 상자가 사용자에게 제공 :

ServiceClient serviceClient; 
try 
{ 
    serviceClient = new ServiceClient(); 
    serviceClient.GetServerTimeCompleted += new EventHandler<GetServerTimeCompletedEventArgs>(serviceClient_GetServerTimeCompleted); 
    serviceClient.GetServerTimeAsync(); 
} 
catch (EndpointNotFoundException ex) 
{ 
    // log exception 
    // show error dialog 
} 

참고 : 이것은 asnchronous 중에 발생한 오류를 처리하지 않습니다를 메서드 콜백 - 그것은 (비슷한) 예외 처리가 필요합니다.

+0

Bermo, ServiceClient Setup 코드를 어떻게 처리해야하는지 보여주는 샘플이 있습니까? 서비스 참조를 사용합니까? 감사합니다 기독교 –

+0

샘플 코드를 추가하여 업데이트했습니다. – Bermo

0

실제로 IIS 기본 웹 사이트 루트 폴더에 crossdomainaccesspolicy.xml을 넣어야합니다. 아래 주어진 xml 콘텐츠를 복사하고 ClinetAccespolicy.xml의 이름으로 저장 한 다음 IIS 기본 웹 사이트 루트 폴더에 넣습니다. 나는 내가 WCF 이야기하는 방식을 변경하지 않지만