Vra

Dit is 2008, en ek is nog steeds verskeur op hierdie een. So ek ontwikkeling van 'n web metode wat 'n komplekse tipe geslaag daarin en teruggekeer van wat dit nodig het. Die twee opsies wat ek speel met is:

  1. Pass en terugkeer werklike besigheid voorwerpe met beide data en gedrag. Wanneer wsdl.exe uitgevoer word, sal dit outomaties skep proxy klasse wat net die data gedeelte bevat, en dit sal outomaties omgeskakel word na en van my werklike besigheid voorwerpe op die bediener kant. Op die kliënt kant, sal hulle net vir 'n dooie volmag tipe gebruik, en hulle sal hê om hulle te karteer in 'n paar werklike besigheid voorwerpe soos hulle goed dink. 'N Groot nadeel is dat as ek "besit" beide die bediener en die kliënt kant, en ek wil dieselfde stel werklike besigheid voorwerpe gebruik, kan ek loop in sekere hoofpyn met naam konflikte, ens (Aangesien die werklike voorwerpe en die gevolmagtigdes benoem dieselfde.)

  2. Vergeet probeer om die "regte" besigheid voorwerpe te slaag. In plaas daarvan, net skep eenvoudige dataverkeer voorwerpe wat ek heen en weer sal karteer om my werklike besigheid met die hand voorwerpe. Hulle kry nog in elk geval gekopieer na nuwe volmag voorwerpe deur wsdl.exe, maar ten minste ek myself nie tricking om te dink dat web dienste kan native hanteer voorwerpe met die maatskappy se logika in hulle.

By the way - Is daar iemand weet hoe om wsdl.exe vertel om nie maak 'n afskrif van die voorwerp? Moet ons nie in staat wees om net vertel dit, "Hey, gebruik hierdie bestaande tipe reg hier. Moenie kopieer dit!"

In elk geval, ek het kinda gevestig op # 2 vir nou, maar ek is nuuskierig wat julle almal dink. Ek het 'n gevoel daar manier beter maniere om dit te doen in die algemeen, en ek kan nie eens heeltemal akkuraat op al my punte wees, so laat my asseblief weet wat jou ervarings gewees het.

Update : Ek het nou net uitgevind dat VS 2008 het 'n opsie om bestaande vorme hergebruik wanneer jy 'n "Service Reference", eerder as om die skep van splinternuwe identiese tipe in die volmag lêer. Sweet.

Was dit nuttig?

Oplossing

Daar is ook 'n argument vir die skeiding van die vlakke - 'n stel van serialiseerbaar voorwerpe wat kry geslaag om en by die web diens en 'n vertaler te karteer en te omskep tussen daardie stel en die besigheid voorwerpe (wat eienskappe nie geskik is vir mag hê wat oor die draad)

Dit is die benadering bevoordeel deur die web diens sagteware fabriek diens fabriek en beteken dat jy kan verander jou besigheid voorwerpe sonder om te breek die web diens koppelvlak / kontrak

Ander wenke

Ek sal 'n baster doen. Ek sou 'n voorwerp soos hierdie gebruik

public class TransferObject
{
    public string Type { get; set; }
    public byte[] Data { get; set; }
}

Ek het toe 'n mooi klein nut wat 'n voorwerp serializes dan saamgepers dit.

public static class CompressedSerializer
{
    /// <summary>
    /// Decompresses the specified compressed data.
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="compressedData">The compressed data.</param>
    /// <returns></returns>
    public static T Decompress<T>(byte[] compressedData) where T : class
    {
        T result = null;
        using (MemoryStream memory = new MemoryStream())
        {
            memory.Write(compressedData, 0, compressedData.Length);
            memory.Position = 0L;

            using (GZipStream zip= new GZipStream(memory, CompressionMode.Decompress, true))
            {
                zip.Flush();
                var formatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
                result = formatter.Deserialize(zip) as T;
            }
        }

        return result;
    }

    /// <summary>
    /// Compresses the specified data.
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="data">The data.</param>
    /// <returns></returns>
    public static byte[] Compress<T>(T data)
    {
        byte[] result = null;
        using (MemoryStream memory = new MemoryStream())
        {
            using (GZipStream zip= new GZipStream(memory, CompressionMode.Compress, true))
            {
                var formatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
                formatter.Serialize(zip, data);
            }

            result = memory.ToArray();
        }

        return result;
    }
}

Toe jy net verby die oordrag voorwerp wat die naam tipe sou hê. Sodat jy kan iets soos dit te doen

[WebMethod]
public void ReceiveData(TransferObject data)
{
    Type originType = Type.GetType(data.Type);
    object item = CompressedSerializer.Decompress<object>(data.Data);
}

nou die saamgeperste serializer gebruik generiese om dit ten sterkste getik, maar jy kan 'n metode maklik om te neem in 'n Tipe voorwerp te deserialize behulp originType bo, hang alles af van jou implementering.

hoop dit gee jou 'n paar idees. O ja, en om jou ander vraag te beantwoord, wsdl.exe ondersteun nie hergebruik tipes, WCF doen al is.

  

Darren het geskryf: Ek sal 'n baster doen. Ek sou 'n voorwerp gebruik soos hierdie ...

Interessante idee ... verby 'n serialized weergawe van die voorwerp in plaas van die (WSDL-ed) voorwerp self. Op 'n manier, ek hou van sy elegansie, maar in 'n ander manier, dit lyk vir die doel van die blootstelling van jou web diens aan potensiële derde partye of vennote of wat ook al verslaan. Hoe sal hulle weet wat om te slaag? Sou hulle moet suiwer staatmaak op dokumentasie? Verloor dit ook 'n paar van die "heterogene kliënt" aspek, aangesien die serialisasie is baie Net spesifieke. Ek bedoel nie om krities te wees, is ek net gewonder of dit wat jy voorstel is ook bedoel vir hierdie tipe gebruik gevalle. Ek sien niks verkeerd met die gebruik daarvan in 'n geslote omgewing though.

Ek moet kyk na WCF ... Ek het al vermy dit, maar miskien is dit tyd.

O, vir seker, ek doen dit net wanneer ek die verbruiker van die webservice of as jy 'n soort van kontroles wat hulle 'n voorwerp versoek van en dan die serialisasie en stuur eerder as om dit direk in beslag die web hanteer jy diens. Maar regtig, indien hulle direk die webservice in beslag, dan sou hulle nie nodig het of noodwendig die vergadering dat die tipe in die eerste plek sal hê in dit, en moet met behulp van die voorwerpe wat WSDL genereer.

En ja, wat ek steek is baie NET spesifieke want ek hou nie daarvan om enigiets anders te gebruik. Die enigste ander keer dat ek verteer webservices buite NET was in JavaScript, maar nou is ek gebruik net into antwoorde in plaas van xml webservice antwoorde:)

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