2011-12-12 3 views
0

의 끝점 예외 처리에서 코드를 통해 동적으로 WCF 웹 서비스에 대한 연결을 생성합니다. 사용자가 웹 서비스의 URL을 지정해야합니다. 그런 다음 EndPointAddress 및 Binding을 만들고 잘 작동합니다. 사용자가 유효하지 않은 URL을 입력하면 는하지만, 예외가 발생합니다 :.내 응용 프로그램 (Windows Phone)의 WCF

"System.ServiceModel.EndpointNotFoundException은 -> [서비스의 주소 즉 메시지를 받아 들일 수에서 듣기에는 엔드 포인트가 없었다 이는 종종 발생합니다 잘못된 주소 또는 SOAP 작업입니다. 자세한 내용은 InnerException을 참조하십시오. "

innerexception은 매우 고전적입니다. "원격 서버가 오류를 반환했습니다 : InnerException에서 NotFound."

문제 :이 예외를 처리 할 수 ​​없습니다. 나는 성공없이 많은 것을 찾았다.

해결책이 있습니까?

내가 찾을 수있는 유일한 방법은 확실히 좋은 생각이 아닌 Reference.cs의 몇 가지 방법입니다.

미리 감사드립니다. 내 나쁜 영어로 죄송합니다. :)!

내 실제 코드는 다음과 같습니다, 그러나 그것은 캐치하지 않는 예외 =>

 MyServiceClient client = new MyServiceClient(myBinding, myEndpointAddress); 
     try 
     { 
      client.RegisterUserCompleted += new EventHandler<RegisterUserCompletedEventArgs>(client_RegisterUserCompleted); 
      client.RegisterUserAsync(); 
     } 
     catch (TimeoutException ex) 
     { 
      MessageBox.Show(ex.Message); 
      client.Abort(); 
     } 

     catch (FaultException ex) 
     { 
      MessageBox.Show(ex.Message); 
      client.Abort(); 
     } 

     catch (CommunicationException ex) 
     { 
      MessageBox.Show(ex.Message); 
      client.Abort(); 
     } 

     catch 
     { 
      MessageBox.Show("Error"); 
      client.Abort(); 
     } 
     finally 
     { 
      client.CloseAsync(); 
     } 
+0

어떻게, 정확히,이 예외를 "처리"하시겠습니까? 또한, 예외가 발생하는 시점은 정확히 무엇입니까? –

답변

0

당신은 client_RegisterUserCompleted 방법으로 시도 어획량을 이동하고 var x = e.Result;

편집 감싸는 필요 : 처음 접근 방식이 잘못 되었기 때문에 ... 먼저 URL (코드의 myEndpointAddress)을 검사해야합니다. 브라우저에서 찾아 볼 수 있습니까 (해당 줄에 중단 점을 설정 한 다음 값을 복사하여 브라우저에 붙여 넣을 수 있습니다).

그 작동 경우 또는 당신이 그것에 탐색 할 때, 다음

<system.diagnostics> <sources> <source name="System.ServiceModel" switchValue="Information, ActivityTracing" propagateActivity="true"> <listeners> <add name="traceListener" type="System.Diagnostics.XmlWriterTraceListener" initializeData= "Trace.svclog" /> </listeners> </source> </sources> </system.diagnostics> 

그런 다음 응용 프로그램을 실행의 내부 WCF 서비스를 호스팅하는 웹 응용 프로그램의 당신의 Web.config이 추가 표시에 에러가 발생했을 경우 또는 찾아보기. 웹 응용 프로그램과 동일한 디렉터리에 Trace.svclog 파일을 만듭니다. 해당 파일을 열고 강조 표시된 빨간색 항목을 찾으십시오. 그러면 예외에 대한 자세한 정보를 얻을 수 있습니다. WCF는 기본적으로 악의적 인 사용자의 속도를 줄이기 위해 전체 정보를 반환하지 않습니다.

+0

조언을 주셔서 감사합니다,하지만 난 이미 이것을 시도. 문제는 메서드가 호출되지 않는다는 것입니다 (웹 서비스 주소가 유효하지 않음). 따라서 RegisterUserCompleted에 결코 도달하지 않습니다. –

2

문제가 해결되었습니다. 해결책은 다음과 같습니다. 클라이언트를 만들기 전에 uri를 테스트해야합니다. 을 위해, 나는 WebRequest 클래스를 확인하고 WebResponse를에 예외를 catch :

public void ValidateUri(String uri) 
    { 
     if (!Uri.IsWellFormedUriString(uri, UriKind.RelativeOrAbsolute)) return; 
     request = WebRequest.Create(uri); 
     request.BeginGetResponse(new AsyncCallback(ValidateUriCallback), null); 
    } 

    private WebRequest request; 
    private void ValidateUriCallback(IAsyncResult result) 
    { 
     try 
     { 
      WebResponse httpResponse = (WebResponse)request.EndGetResponse(result); 

      // Create the client here 
      ServiceClient client = new MyServiceClient(myBinding, myEndpointAddress); 
     client.RegisterUserCompleted += new EventHandler<RegisterUserCompletedEventArgs>(client_RegisterUserCompleted); 
     client.RegisterUserAsync(); 

     } 
     catch (WebException ex) 
     { 
      var response = ex.Response as System.Net.HttpWebResponse; 
    if (response!=null 
     && response.StatusCode == HttpStatusCode.NotFound) 
    { 
     Dispatcher.BeginInvoke(delegate() 
       { 
        MessageBox.Show("The web service address is not valid", "Sorry", MessageBoxButton.OK); 
       }); 
    } 
     } 
+0

몇 년 후 저는 Xamarin 앱에서이 문제를 겪었습니다. App.cs의 함수로 ValidateUri를 작성하고 콜백을 전달했습니다.이 방법을 사용하면 앱에서 동일한 함수를 사용할 수 있고 필요한 서비스에 따라 오류 케이스를 다르게 처리 할 수 ​​있습니다. public static void TestWebAccess (문자열 uri, ref WebRequest 요청, Action callBack)' – EvilGeniusJamie