Jaký je váš preferovaný způsob posílání složitých dat přes webové služby?

hlasů
9

Je to 2008, a já jsem stále roztrhaný na tento jeden. Takže jsem vyvíjet webové metodu, která potřebuje komplexní typ předán do něj a vrátil se z něj. Tyto dvě možnosti jsem si pohrávala s jsou:

  1. Složit a vrátit skutečných obchodních objektů jak s daty a chováním. Když Wsdl.exe je spuštěn, bude automaticky vytvoří třídy proxy, které obsahují pouze datové části, a ty budou automaticky převedeny do a ze svých skutečných obchodních objektů na straně serveru. Na straně klienta, bude se dostanou pouze k použití němého typ proxy serveru, a oni budou muset map do nějaké skutečné obchodní objekty tak, jak uznají za vhodné. Velkou nevýhodou je, že když jsem „vlastnit“ serveru i na straně klienta, a chci použít stejnou sadu real obchodních objektů, mohu narazit na některé hlavy s konflikty názvů atd (Vzhledem k tomu, reálných předmětů a proxy mají stejná jména.)

  2. Zapomenout snaží projít „skutečné“ obchodních objektů. Místo toho stačí vytvořit jednoduché objekty dataTransfer který budu mapovat tam a zpět, aby můj skutečný obchodní objekty ručně. Oni ještě získat zkopírovány do nových objektů Proxy Wsdl.exe tak jako tak, ale aspoň nebudu podvádět sám sebe, aby si mysleli, že webové služby může nativně zpracovávat objekty s obchodní logiky v nich.

Mimochodem - Ví někdo, jak zjistit Wsdl.exe na to vytvořit kopii objektu? Neměli bychom být schopni prostě říct: „Hele, použít tento existující typ támhle. Nekopírujte to!“

V každém případě jsem trochu usadil na # 2 pro tuto chvíli, ale jsem zvědavý, co si všichni myslí. Mám pocit, že existuje způsob, lepší způsoby, jak toho dosáhnout obecně, a já se ani nemusí být zcela přesné u všech mých bodů, tak prosím, dejte mi vědět, jaké jsou vaše zkušenosti byly.

Aktualizace : Právě jsem zjistil, že VS 2008 má možnost použít existující typy při přidávání „Servis Reference“, spíše než vytvářet zcela nový stejného typu v souboru serveru proxy. Sladký.

Položena 16/08/2008 v 04:58
zdroj uživatelem
V jiných jazycích...                            


4 odpovědí

hlasů
4

Já bych to hybrid. Chtěl bych použít objekt podobného

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

Potom mám pěkný malý nástroj, který Serializuje objekt pak komprimuje ho.

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;
    }
}

Pak byste jen předat objekt přenosu, který by měl název typu. Takže si mohl udělat něco takového

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

teď stlačený serializer používá generik, aby byl silně napsaný, ale je možné, aby způsob snadno vzít v objektu typu rekonstruovat pomocí originType výše, to vše závisí na vaší implementaci.

Doufám, že to vám dá nějaké nápady. Jo, a abych odpověděl na vaši druhou otázku, Wsdl.exe nepodporuje Užití typy, WCF dělá ačkoli.

Odpovězeno 16/08/2008 v 05:31
zdroj uživatelem

hlasů
1

tam je také argument pro oddělování vrstev - mají sada serializovatelný objektů, které si prošel do az webové služby a překladatele zmapovat a převádět mezi tímto souborem a obchodních objektů (což může mít vlastnosti, které nejsou vhodné pro průchod přes drát)

Jeho přístup zvýhodněný software webové služby z výroby továrny služby a znamená, že můžete změnit své obchodní objekty bez porušení webové služby rozhraní / smlouvu

Odpovězeno 21/08/2008 v 13:31
zdroj uživatelem

hlasů
1

oh, pro jistotu, jen jsem to, když jsem spotřebitele o webové služby nebo pokud máte nějaký ovladač, který by požádat objekt z a pak zvládnout serializaci a odesílání namísto nich přímo náročné webové služby. Ale ve skutečnosti, jsou-li přímo náročné webové služby, pak by nebylo nutné ani nutně sestavu, která by měla typ v něm na prvním místě, a měl by být pomocí objektů, které WSDL vygeneruje.

A ano, to, co jsem navrhl, je velmi NET specifická, protože nemám rád používat něco jiného. Jedinou další čas i konzumovat Webservices mimo NET byla v JavaScriptu, ale teď mohu použít pouze JSON odpovědí namísto odpovědí XML Webservice :)

Odpovězeno 16/08/2008 v 06:16
zdroj uživatelem

hlasů
1

Darren napsal: Já bych to hybrid. Chtěl bych použít objekt takhle ...

Zajímavý nápad ... absolvování serializovaný verzi objektu namísto WSDL (ed) samotného objektu. Svým způsobem se mi líbí jeho eleganci, ale jiným způsobem, zdá se, že v rozporu s účelem odhalení své webové služby potenciálním třetím stranám, partnerům nebo cokoliv jiného. Jak by vědí, co mají projít? Budou muset spoléhat výhradně na dokumentaci? Také ztrácí některé z „heterogenní klientské“ aspekt, protože serializace je velmi specifická .Net. Nechci být kritický, já jsem jen přemýšlel, jestli to, co jste navrhuje je také určen pro tyto typy případů užití. Nevidím nic, s jeho použitím v uzavřeném prostředí, i když špatně.

Měl bych se podívat do WCF ... jsem ji vyhnout, ale možná je čas.

Odpovězeno 16/08/2008 v 05:49
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more