문제

System.Object 유형(WSDL의 xs:anyType) 매개 변수를 사용하여 메서드를 정의하는 서비스 계약이 있습니다.이 매개변수에서 단순 유형뿐만 아니라 복합 유형도 전달할 수 있기를 원합니다.단순 유형은 잘 작동하지만 WSDL에 정의된 복합 유형을 전달하려고 하면 다음 오류가 발생합니다.

요소 'http://tempuri.org/:값'에는 '의 데이터가 포함되어 있습니다.http://schemas.datacontract.org/2004/07/MyNamespace:MyClass' 데이터 계약.deserializer는 이 계약에 매핑되는 모든 유형에 대한 지식이 없습니다.알려진 유형 목록에 'MyClass'에 해당하는 유형을 추가합니다. 예를 들어 KnownTypeAttribute 특성을 사용하거나 DataContractSerializer에 전달된 알려진 유형 목록에 추가합니다.

이미 내 WSDL에 있으므로 이를 알려진 유형으로 추가해도 도움이 되지 않습니다."xs:anyType" 매개변수를 통해 복합 유형의 객체를 어떻게 전달할 수 있나요?

더 많은 정보:

NetDataContract를 사용할 때 이것이 작동한다고 생각하지만 내 클라이언트가 Silverlight이기 때문에 사용할 수 없습니다.

명시적으로 xs:anyType을 확장하는 복잡한 유형에 대한 참조를 본 적이 있지만 WCF에서 해당 작업을 수행하는 WSDL을 생성하는 방법을 모르고 도움이 될지 여부도 모릅니다.

감사해요

도움이 되었습니까?

해결책 3

ServiceKnownType 특성을 사용하여 이 문제를 해결했습니다.서비스 계약에 복잡한 유형을 서비스 알려진 유형으로 추가하면 오류가 사라집니다.지난번에 시도했을 때 왜 작동하지 않았는지 잘 모르겠습니다.

이는 어떤 식으로든 WSDL에 영향을 주지 않는 것으로 보입니다. 따라서 직렬화된 스트림에는 내 유형을 사용하여 개체를 역직렬화할 수 있음을 역직렬 변환기에 알리는 약간의 차이가 있어야 한다고 생각됩니다.

다른 팁

NetDataContractSerializer에는 유형 정보가 포함되어 있으므로 NetDataContract가 작동합니다.

KnownType 특성은 DataContractSerializer에 메시지를 역직렬화하는 방법을 지시합니다.구현에 따라 이는 공개 계약에 의해 정의된 정보이며 WSDL에 속하지 않습니다.

역직렬 변환기가 적절한 유형을 식별하고 인스턴스를 생성해야 하기 때문에 이전 데이터 유형은 전달할 수 없습니다.

DataContract에 하드 코딩하는 대신 런타임 시 알려진 유형을 파생시킬 수 있습니다.구경하다 여기 샘플을 위해.

이것이 도움이 되기를 바랍니다.내 동료가 이 코드를 사용하여 복잡한 데이터 유형을 보내는 것을 보았으며 나에게는 이것이 매우 간단합니다.이는 basicHttpBinding과 함께 사용되었으며 MOSS BDC 및 기본 바인딩을 사용하는 다른 응용 프로그램과도 잘 작동합니다.

  1. 일반 클래스를 기반으로 데이터 계약 만들기
  2. 정보를 전송해야 할 때 데이터 계약을 사용하세요.

    [DataContract(네임스페이스 = "http://Service.DataContracts", name ="serviceedatacontractbase ")] 공개 클래스 ServiceDatacontract {

    public ServiceDataContract() { }
    
    public ServiceDataContract(TValueType Value)
    {
        this.m_objValue = Value;
    }
    
    private TValueType m_objValue;
    
    [DataMember(IsRequired = true, Name = "Value", Order = 1)]
    public TValueType Value
    {
        get { return m_objValue; }
        set { m_objValue = value; }
    }
    

    }

복잡한 데이터 형식을 반환하는 WCF 함수에서 필요할 때마다 이 데이터 계약을 사용하세요.예를 들어:

public ServiceDataContract<string[]> GetStrings()
{
    string[] temp = new string[10];
    return new ServiceDataContract<string[]>(temp);
}

업데이트:ServiceDataContract는 TValueType을 사용하는 일반 클래스입니다.HTML 렌더링에 문제가 있어서 나타나지 않습니다.

데이터 계약 서로게이트를 사용하여 닷넷 특정 유형이거나 상호 운용할 수 없는 유형인 지원되지 않는 개체를 매핑해 보세요.보다 MSDN

지금은 다른 데이터 계약 유형이나 단순 유형을 래핑할 수 있는 새로운 데이터 계약 유형을 만들어 이 문제를 해결했습니다.이제 Object 유형을 전달하는 대신 이 래퍼 클래스를 전달합니다.정상적으로 작동하지만 원래 문제에 대한 해결책이 있는지 알고 싶습니다.

전달하려는 유형을 지정하여 ServiceKnownType 특성을 추가하려고 시도했지만 여전히 동일한 오류가 발생합니다. 또한 데이터 계약에 KnownType 특성을 추가해 보았습니다(데이터 계약과 동일한 유형이기 때문에 어리석은 것처럼 보였습니다).컴파일 타임에 추가하는 것이 도움이 되지 않는다면 런타임에 추가하는 것도 도움이 되지 않을 것이라고 추측합니다.

다른 복합 유형을 확장하는 경우 해당 기본 유형에 KnownType 속성을 추가하고 싶을 것 같습니다.하지만 내 기본 유형이 Object이기 때문에 이를 수행할 수 있는 방법이 없습니다.

대리자의 경우 계약이 정의되지 않은 래핑 유형에 사용되는 것 같습니다.그러나 내 경우에는 계약이 정의되어 있습니다.

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