문제

WCF 인터페이스에서 해시 세트를 사용하고 있습니다

[ServiceContract]
public interface IwcfServerSync
{
    [OperationContract]
    void Test(HashSet<int> someHashSet);
}

서비스 참조를 만들 때 해시 세트는 int []로 바뀝니다.

ServiceKnownType를 추가했습니다.

[ServiceKnownType(typeof(System.Collections.Generic.HashSet<int>))]

그리고 일부 구성을 시도했지만 변경할 수 없었습니다.

내가 하드 코딩 된 모든 것이 효과가 있지만, 내 참조를 업데이트 할 때마다 변경하는 것은 정말 성가신 일입니다.

나는 아마도 뭔가 잘못하고있는 것, 어떤 포인터 나 아이디어를하고 있습니까?

도움이 되었습니까?

해결책

컬렉션은 전선을 넘어갈 때 단순화됩니다. IDE 및 명령 줄을 통해 수집 유형을 지정할 수 있습니다 (svcutil /collectionType), 그러나 그것은 적용됩니다 모두 API 컬렉션. 나는 당신이 그것을 받아들이고 코드를 통한 불일치를 처리해야한다고 생각합니다. 궁극적으로 와이어에서 컬렉션은 XML (적어도 표준 바인딩을 통해)입니다.

<items>
   <item ...>...</item>
   <item ...>...</item>
   <item ...>...</item>
</items>

- 따라서 배열 사이 (스키마에서)를 알 수없는 이유 (T[]), ㅏ List<T>, ㅏ HashSet<T>, a MyFunkyCollection<T>.

어셈블리 공유를 사용하는 경우 (예 : 동일한 서비스 계약 조립이 클라이언트에 있습니다. 그리고 서버) 그러면 이것은 일어나지 않을 것입니다. 그러나 그것은 SOA/MEX의 의도를 물리칩니다. 그러나 IS는 상당히 많이 사용되는 접근법입니다. 따라서 IDE는 직접 지원하고 스위치를 통해 명령 줄을 지원합니다 (svcutil /reference).


IDE를 지원하는 경우 ... 클래스 라이브러리 (DLL)에 서비스 계약 및 데이터 계약을 작성한 다음 두 프로젝트 ( 서버 프로젝트 및 클라이언트 프로젝트). 이제 추가하십시오 서비스 참조 클라이언트 프로젝트에서 서버 엔드 포인트 (.SVC)까지. vs2008을 사용하는 경우 유형에 대한 로컬 참조를 자동으로 확인하고 프록시 생성 대신에 사용하는 것 - 의미 : 클라이언트 코드를 사용합니다. IwcfServerSync 이미 사용 여부를 알고있는 클래스 라이브러리에서 HashSet<T> 등.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top