WCF에서 복잡한 유형을 통과하는 표준화 된 방법은 무엇입니까?
-
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
{
....
}