2010-06-25 6 views
0

WCF 서비스에서 데이터를 반환 할 때이 오류 메시지가 나타납니다.소켓 연결이 중단되었습니다. 가능한 직렬화 예외?

"메시지가 처리되는 동안 오류가 발생했거나 원격 호스트에서 수신 시간 초과 또는 기본 네트워크 리소스 문제가 발생하여 소켓 연결이 중단되었습니다. 로컬 소켓 시간 초과가 '00 : 00 : 59.9960000 ' "

~ 59 초가 표시되기 때문에 오해의 소지가 있지만 예외는 약 2 초입니다. 이 오류 메시지를 수신 한 마지막 순간 엔티티 프레임 워크 객체를 직렬화하여 발생하는 무한 루프와 관련이 있습니다. 다행히도, 나는 변화를 만들었으므로 쉽게 발견 할 수있었습니다.

이번에는 어떤 문제가 발생했는지 알 수 없습니다. 나는 엔티티 프레임 워크 클래스를 변경하여 변경되지 않았 음을 알았습니다. 내가 아는 한, 데이터베이스가 상당히 크기 때문에 그것을 증명하는 방법을 알지 못하더라도 데이터베이스는 동일하게 유지되었습니다.

디버거를 사용하여 WCF 코드를 단계별로 실행하면 데이터가 올바르게 수집되고 있음을 알 수 있습니다. 심지어 정보를 반환하려고 시도합니다. 그러나, 클라이언트 측 프록시에 나는이 코드 줄에 예외가 나타납니다

return Channel.GetDocuments(user, criterion);

아무도 날이 예외를 추적하는 데 도움이 될 수 있습니다 어떤 통찰력이나 도구가 있습니까?

답변

1

불행 할 것이다. 데이터베이스에서 제거되는 열과 관련이 있으며 엔티티 프레임 워크 모델이 업데이트되지 않았습니다. 이전에 생각했던 순환 루프가 아니 었습니다.

올바른 방향으로 나를 가리킨 속임수입니다.

클라이언트 측 프록시

public List<ImageData> GetDocuments(User user, DocumentSearchCriterion criterion) 
{ 
    Channel.GetDocuments(user, criterion); 
} 

WCF 사이드 서비스이 일반적인 오해의 소지를 제외하고 다른 사람을 도움이

public List<ImageData> GetDocuments(User user, DocumentSearchCriterion criterion) 
{ 
    List<ImageData> documents = new DocumentRepository().GetDocuments(user, criterion); 

    // Temporary test to see if we can serialize the data. This is only for debugging 
    // purposes and needs to be removed from production code. 
    DataContractSerializer serializer = new DataContractSerializer(documents.GetType()); 
    using(FileStream stream = new FileStream("SerializerOutput.xml", FileMode.Create)) 
    { 
     // This line will give an exception with useful details while debugging. 
     serializer.WriteObject(stream, documents); 
    } 

    return documents; 
} 

희망.

0

다음 사항을 확인

  1. 내 경험
  2. 대부분의 가능성이 .config 파일에 제한 시간을 연장 할 필요가 있도록 데이터를 많이 가지고하면 유형의 순환 참조를 가지고있다 당신은 WCF 기능에서 돌아오고 있습니다. 이 같은 것을 가지고있는 클래스가있는 경우

때문에, WCF 내가 문제를 발견

[DataContract] 
public class MyClass 
{ 
    public ChildObject(int i) 
    { 
    } 

    [DataMember] 
    public MyClass Parent 
    { 
     get; 
     set; 
    } 
} 
+0

또한 순환 참조라고 의심됩니다. 어떤 'DataMember'가 범인인지 알아내는 영리한 방법이 있습니까? 나는 속성을 들여다 보았고 '명백한'것도 튀어 나오지 않았습니다. –

+0

두 가지를 찾습니다. 1. 호출자와 동일한 유형의 반환 유형입니다. 2. 이것은 일반적으로 프로퍼티입니다. 프로퍼티를 가진 클래스이며, 그 중 하나는 객체 그래프의 어딘가에있는 부모와 같은 타입입니다. 내 머리 꼭대기에서 내가 아는 어떤 트릭도 없다. –