Vra

Ek het 'n dienskontrak wat 'n metode met 'n parameter van tipe System.Object definieer (xs: anyType in die WSDL). Ek wil in staat wees om eenvoudige tipes sowel as komplekse tipes slaag in hierdie parameter. Eenvoudige tipes werk goed, maar wanneer ek probeer om 'n komplekse tipe wat gedefinieer word in my WSDL slaag, hierdie fout kry ek:

Element ' http://tempuri.org/:value ' bevat data van die '< 'n href = "http://schemas.datacontract.org/2004/07/MyNamespace:MyClass" rel = "nofollow noreferrer"> http://schemas.datacontract.org/2004/07/MyNamespace:MyClass ' data kontrak. Die deserializer het geen kennis van enige soort wat kaarte om hierdie kontrak. Voeg die tipe wat ooreenstem met 'MyClass' om die lys van bekende tipes -. Byvoorbeeld deur die gebruik van die KnownTypeAttribute kenmerk of deur dit toe te voeg tot die lys van bekende tipes geslaag om DataContractSerializer

Voeg dit as 'n bekende tipe nie help nie, want dit is reeds in my WSDL. Hoe kan ek slaag 'n voorwerp van 'n komplekse tipe via 'n "xs: anyType"? Parameter

Meer inligting:

Ek glo dit werk wanneer die gebruik van NetDataContract, maar ek kan nie gebruik dat omdat my kliënt is Silver.

Ek het gesien hoe verwysings na komplekse tipes uitdruklik uitbreiding xs: anyType, maar ek het geen idee hoe om te maak WCF genereer 'n WSDL wat dit doen, en ek het geen idee of dit selfs sou help

.

Dankie

Was dit nuttig?

Oplossing 3

Ek het hierdie probleem opgelos deur die gebruik van die ServiceKnownType kenmerk. Ek voeg net my kompleks tipe as 'n diens bekend tipe op my dienskontrak, en die fout gaan weg. Ek is nie seker hoekom dit nie laaste keer dat ek probeer om dit gewerk het nie.

Dit lyk nie of die WSDL op enige wyse beïnvloed, so ek vermoed dat die serialized stroom 'n verskil wat die deserializer dat die voorwerp kan deserialized met behulp van my soort lig moet hê.

Ander wenke

Die NetDataContract werk omdat die NetDataContractSerializer sluit tik inligting.

Die KnownType kenmerk opdrag die DataContractSerializer hoe om die boodskap deserialize. Om implementering spesifieke, dit is inligting oor-and-bo wat gedefinieer word deur die openbare kontrak en hoort nie in die WSDL.

Jy gaan nooit in staat wees om enige oue data tipe slaag omdat die deserializer moet die toepaslike tipe te identifiseer en te skep 'n geval.

Jy mag in staat wees om jou bekend tipes lei tydens looptyd eerder as om hulle hard-gekodeerde in die DataContract. Neem 'n blik hier vir 'n monster.

Ek hoop dit sal help. Ek het 'n kollega van my gebruik van hierdie kode om ingewikkelde tipes data te stuur en vir my is dit eenvoudig. Dit is gebruik met basicHttpBinding en dit werk baie goed met MOSS BDC asook ander programme wat die basiese bindende gebruik.

  1. Skep 'n data kontrak op grond van 'n generiese klas
  2. Gebruik die data kontrak wanneer die inligting gestuur moet word

    [DataContract (Naamruimte = " http: //Service.DataContracts ", name = "ServiceDataContractBase")] openbare klas 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; }
    }
    

    }

Gebruik hierdie data kontrak waar ookal dit is wat nodig is in die WCF funksies wat die ingewikkelde tipe data terugkeer. Byvoorbeeld:

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

Update: ServiceDataContract is generiese klas gebruik TValueType. Dit is nie verskyn as gevolg van iets fout met die lewering van die HTML.

Probeer gebruik data kontrak Surrogates om ongesteunde voorwerp wat dot netto spesifieke of nie compatible tipes te karteer. Sien MSDN

Vir nou is ek om hierdie gewerk deur die skep van 'n nuwe data kontrak tipe wat óf 'n ander data kontrak tipe of 'n eenvoudige tipe kan draai. In plaas van verbygaande aard Object, nou ek slaag hierdie wrapper klas. Dit werk OK, maar ek wil nog graag wou weet of daar 'n oplossing vir die oorspronklike probleem.

Ek het probeer om die toevoeging van die ServiceKnownType kenmerk, wat die tipe wat ek probeer om te slaag, maar ek kry steeds dieselfde fout. Ek het ook probeer toevoeging van die KnownType kenmerk om my data kontrak (wat gelyk dom, want dit was dieselfde tipe as die data kontrak). Ek sou raai dat hulle te voeg by runtime sal nie help as hulle te voeg tydens kompilering help nie.

As ek die uitbreiding van 'n ander komplekse tipe, dit lyk vir my dat ek wil die KnownType kenmerk voeg by dat base tipe. Maar sedert my base tipe is Object, kan ek nie sien enige manier om dit te doen.

As vir Surrogates, dit lyk vir my dat hierdie is gebruik word vir wikkel tipes wat nie 'n kontrak omskryf het nie. In my geval egter ek het die kontrak omskryf.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top