2010-05-11 5 views
0

나는 WCF를 처음 사용했습니다. 이전에 웹 서비스를 사용하기 위해 아약스를 작성했지만,이 프로젝트에서는 WCF에 아약스를 사용하려고합니다.아약스와 WCF 작업. 하지만 몇 가지 미니 후, 작동하지 않습니다

프로젝트를 빌드하고 ajax를 사용하여 wcf를 작성한 후 성공적으로 리턴을 수신합니다. 하지만 10 분 이상 지나면 리턴 값을 얻지 못하고, 아약스는 에러 함수를 호출하고 피 들러는 아무것도 반환하지 않습니다.

소스를 수정하지 않고 프로젝트를 다시 작성하면 다시 정상적으로 반환됩니다.

이 경험이 있거나 그 이유를 알고있는 사람이 누구입니까?

감사합니다.

+1

불쌍한 영어에 대해 사과드립니다. –

답변

0

아마도 연결을 종료하지 않을 것입니다. Try/Catch/Finally 블록에서 모든 호출을 래핑해야합니다.

C# :

ServiceClient service = GetService();

public static void CallService<T>(Action<T> action) where T 
      : class, ICommunicationObject, new() 
    { 
     var client = new T(); 

     try 
     { 
      action(client); 
      client.Close(); 
     } 
     finally 
     { 
      if (client.State == CommunicationState.Opened) 
      { 
       try 
       { 
        client.Close(); 
       } 
       catch (CommunicationObjectFaultedException) 
       { 
        client.Abort(); 
       } 
       catch (TimeoutException) 
       { 
        client.Abort(); 
       } 
      } 
      if (client.State != CommunicationState.Closed) 
      { 
       client.Abort(); 
      } 
     } 
    } 

각 WCF 호출 서비스 클래스의 새 인스턴스를 생성해야합니다 : 여기

 Dim service As ServiceClient = GetService() 

     Try 
      Dim request As New SomeRequest() 

      Dim response As SomeResponse = service.GetSome(request) 

      Return response.Result 
     Catch ex As Exception 
      ' do some error handling 
     Finally 
      Try 
       If service.State <> CommunicationState.Faulted Then 
        service.Close() 
       End If 
      Catch ex As Exception 
       service.Abort() 
      End Try 
     End Try 
0

 try 
     { 
      SomeRequest request = new SomeRequest(); 

      SomeResponse response = service.GetSome(request); 

      return response.Result; 
     } 
     catch (Exception ex) 
     { 
      // do some error handling 
     } 
     finally 
     { 
      try 
      { 
       if (service.State != CommunicationState.Faulted) 
       { 
        service.Close(); 
       } 
      } 
      catch (Exception ex) 
      { 
       service.Abort(); 
      } 
     } 

또는 VB는 WCF 서비스를 호출하는 것이 좋습니다. 이 코드를 사용하면 다음과 같이 서비스를 호출 할 수 있습니다.

CallService<MyService>(t => t.CallMyService()); 
+0

이것은 또한 서비스 코드 내에서 불필요한 오류 예외 (사용자가 던질 수 있음)를 삼 키지 않습니다. 이것은 단지 클라이언트 주변의 통신 오류를 잡아서 처리하며, 모든 곳의 통신 채널을 엉망으로 만들지 않고 서비스 호출에 대해 적절한 예외 배치를 허용합니다. –

관련 문제