2011-05-07 5 views
30

WCF 서비스와 클라이언트를 작성하고 있습니다. 서비스와 클라이언트 사이에 내 사용자 지정 클래스의 개체를 보내고 싶습니다. WCF에 DataContract 특성이 필요합니다.

나는 3 개 모듈

  • WCF 서비스 WCF 서비스와 클라이언트 모두 일반적인 클래스 라이브러리에 대한 참조를 가지고

  • WCF 클라이언트
  • 일반적인 클래스 라이브러리를 가지고있다. 모든 클래스에 DataContract 특성을 표시하고 싶지 않습니다.

    그래서 내 질문은 "DataContract 특성이 WCF에 필요합니까?"

    .NET 4 및 netTcpBinding을 사용합니다.

  • 답변

    22

    정식 데이터 계약 마커를 사용하지 않으면 IIRC가 올바르게 호출 된 경우 기본적으로 필드 직렬화 기처럼 작동합니다. 이렇게하면 개인용 변경으로 인해 클라이언트/서버가 손상 될 수 있기 때문에 버전은 작동하지만 실행하기가 쉽지 않습니다. IMO 당신은 항상 data-contract/data-member 속성으로 WCF 타입을 공식적으로 장식해야한다. 그것은 그들 없이도 작동 할 것입니다,하지만 잘못된 이유 (IIRC, 원래 공식 마커없이 작동하지 않았습니다).

    +25

    IIRC는 기술적 인 용어라고 생각했습니다. 그것이 '정확하게 기억한다면'이라는 의미입니다. 롤! – thewpfguy

    +2

    잘 쓰레기, 수년간 나는 항상 그것이 "ReCall이라면"서 있었다고 생각했다. R과 C가 다른 단어를 나타내는 것이 더 합리적이라고 생각한다. –

    +2

    http://msdn.microsoft.com/en-us/library/ms733127%28v=vs.110%29.aspx에는 공개 읽기/쓰기 속성 및 필드 만 기본적으로 계약에 포함되어 있다고 나와 있습니다. –

    3

    , 당신의 서비스가 그들없이 잘 작동합니다 : 보라.

    그런데, 나는 정말로 당신의 서비스와 클라이언트가 클래스 라이브러리를 공유하는 것이 최고의 디자인 접근법이라고 생각하지 않는다. DataContracts를 통해 유형을 공개하면 훨씬 더 명확 해집니다.

    언젠가 누군가가 서비스를 사용하려고하지만 공유 클래스 라이브러리에 액세스 할 수 없으면 어떻게 될까요?

    +0

    내 클라이언트 만 해당 서비스에서 작동합니다. – user179437

    +0

    서비스에 내 사용자 정의 클래스의 인수가 있고 그 클래스에 기본 생성자가없는 메소드 ([OperationContract])가 있으면 WCF 서비스 호스트에서 InvalidDataContractException을 수신합니다. – user179437

    +0

    서비스와 클라이언트가 모두 클래스 라이브러리를 공유하는 경우에도 WCF는 형식을 serialize하려고 시도하기 때문에 기본 생성자가 필요합니다. 귀하의 디자인은 웹 서비스 디자인의 원칙에 위배되며 .NET 리모팅과 같은 다른 것을 사용하는 것이 더 낫다고 주장 할 것입니다. –

    7

    없이, 기술적으로

    "DataContract 속성은 WCF에 대한 필요합니다." 이것은 DataContractSerializer 사용 여부에 달려 있습니다 (많은 바인딩에서 기본값 임).

    다른 옵션이 있습니다 :

  • Data Contract Surrogates를 사용해보십시오

    1. 이 고려 대안 시리얼 라이저 (속성은 여전히 ​​을 필요하지만 잠재적으로 유 이잖아 관련된 경우, 훼손되지 않은 클래스를 남길 수 있습니다 의미 하는가)
    2. 데이터 계약 속성없이 클래스를 직렬화 할 때 serialization defaults을 사용하십시오.
  • +0

    축소 된 ContractDescription 조언. 나는 당신이 어떻게 든 serializer를 바꾸기 위해 ContractDescription을 사용할 수 있다고 생각한다. – Schneider