WCF에서 복잡한 유형을 통과하는 표준화 된 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/814728

  •  03-07-2019
  •  | 
  •  

문제

저는 WCF의 초보자이며 현재 TCP WCF 서비스를 개발 중이며 매개 변수를 올바르게 전달하는 것을 이해하는지 확실하지 않으므로 댓글을 달고 표준화 된 방법을 제공하는 것이 좋습니다.

일을 명확히하기 위해 단일 방법을 갖고 단일 클래스를 노출시키는 외부 .NET DLL에 의존하는 테스트 목적을위한 작은 서비스를 개발했습니다. 서비스 계약 코드

    [ServiceContract]
    public  interface IMyService
    {
        [OperationContract]
        int Test1(actionType at, calculationType ct, action a);
        [OperationContract]
        int Test2(DataSeries s);
    }

어디에 actionType,calculationType,action 외부 DLL 내부에서 선언 된 열거입니다 DataSeries DLL 내부에서 선언 된 클래스입니다.

원리 정의 DataSeries DLL의 클래스는 표시됩니다 [Serializable] 만, 아니요 [DataMember] 회원들에게.

클라이언트와 서버 측에서 3 번째 DLL을 사용하고 있습니다. 놀랍게도 두 응용 프로그램은 포팅하지 않고 잘 작동하는 것이 었습니다. [DataContract] DataSeries 클래스에서 그리고 사용하지 않고 [EnumMember] 내부 열거, [DataMember] 내부 수업.

그래서 무슨 일이 일어나고 있습니까?

또 다른 실험 :

클라이언트 측에서 제 3자를 제거하고 서비스를 사용하여 VS2008이 열거와 DataSeries 클래스와 적절한 속성으로 표시합니까? 처럼

    [System.CodeDom.Compiler.GeneratedCodeAttribute      ("System.Runtime.Serialization", "3.0.0.0")]
    [System.Runtime.Serialization.DataContractAttribute(Name="actionType",  Namespace="http://schemas.datacontract.org/2004/07/DBInterface")]
    public enum actionType : int {

        [System.Runtime.Serialization.EnumMemberAttribute()]
        All = 0,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Buy = 1,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Sell = 2,
    }
도움이 되었습니까?

해결책

데이터를 사용합니다, Datamember 그리고 열거적 인 속성은 다음에 의해 사용됩니다 DataContractSerializer (대개 Basichttpbinding 또는 wshttpbinding). TCP 결합으로 엔드 포인트를 노출시키는 경우 (nettcpbinding) 뿐 SerializableAttribute 필요합니다. DataContractSerializer를 사용하면 클래스에 SerializableAttribute 만 추가 할 수 있으며 모든 필드를 자동으로 직렬화합니다.

서비스를 상호 운용하기 위해 서비스를 사용하려면 BasichttpBinding을 사용하고 DataContract 및 Datamember 속성으로 클래스를 표시하십시오. 클라이언트가 .NET 응용 프로그램 인 경우 NetTCPBinding을 사용하고 SerializableAttribute로 클래스를 표시하십시오.

당신은 또한 이것을 읽을 수 있습니다 게시하다 다른 바인딩을 비교하기 위해.

다른 팁

그러나 DataContract 또는 속성을 사용하지 않고 클라이언트 측이 올바르게 작동하는 것을 발견했습니다.

예, 그렇습니다. 사용하는 데이터 유형에 [DataContract]가 표시되지 않으면 WCF는 기본 비누 세리어 라이저를 사용하여 공개적 인 모든 것을 직렬화하려고 시도합니다 (모든 공개 속성).

그것은 당신이 원하는 / 기대하는 것이 아닐 수도 있습니다. 자신 (또는 나중에 코드를 유지 해야하는 다른 프로그래머)에 대한 의도를 명확하게할수록 더 좋습니다. 무대 뒤에서 발생하는이 "마술 트릭"은 때때로 혼란을 일으키는 경향이 있습니다. ~ 아니다 그들에게 너무 의존합니다

마크

그래서 저는 [dataContract] s를 사용하고 단일 매개 변수를 전달하고 데이터 계약을 되돌립니다.

이는 기존 클라이언트를 위반하지 않고 데이터 계약에 대한 새로운 선택적 속성으로 데이터 계약을 확장 할 수 있으므로 더 많은 유연성을 제공합니다.

열거 나는 또한 데이터 연락처를 만듭니다. 그런 다음 똑같이 할 수 있기 때문에 아무것도 깨지 않고 열거를 확장하고 네임 스페이스를 제어 할 수 있습니다.

[DataContract(Namespace = "http://namespace.mydomain.com/2009/05", Name = "ReferenceTypeData")]
public enum GenderEnum
{
    [EnumMember()]
    Unknown = 0,
    [EnumMember()]
    Male = 1,
    [EnumMember()]
    Female = 2
}

그런 다음 서비스 계약을 표시해야합니다

[ServiceKnownType(typeof(GenderEnum))]
public interface IServiceContract
{
    ....
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top