9

それは2008年です、そして私はまだこれに引き裂かれています。そこで、複合型を渡してそこから返す必要があるWebメソッドを開発しています。私がいじっている2つのオプションは次のとおりです。

  1. データと動作の両方を含む実際のビジネスオブジェクトを渡し、返します。wsdl.exeを実行すると、データ部分のみを含むプロキシクラスが自動的に作成され、サーバー側の実際のビジネスオブジェクトとの間で自動的に変換されます。クライアント側では、ダムプロキシタイプのみを使用できるようになり、適切と思われる実際のビジネスオブジェクトにマップする必要があります。ここでの大きな欠点は、サーバー側とクライアント側の両方を「所有」していて、同じセットの実際のビジネスオブジェクトを使用したい場合、名前の競合などで特定の頭痛の種に遭遇する可能性があることです(実際のオブジェクトとプロキシの名前は同じです。)

  2. 「実際の」ビジネスオブジェクトを渡そうとするのを忘れてください。代わりに、実際のビジネスオブジェクトに手動でマッピングする単純なDataTransferオブジェクトを作成するだけです。いずれにせよ、それらはwsdl.exeによって新しいプロキシオブジェクトにコピーされますが、少なくとも、Webサービスがビジネスロジックを含むオブジェクトをネイティブに処理できると思い込ませることはありません。

ちなみに-オブジェクトのコピーを作成しないようにwsdl.exeに指示する方法を知っている人はいますか?「ねえ、この既存のタイプをここで使用してください。コピーしないでください」とだけ言うことはできません。

とにかく、今のところ#2に落ち着きましたが、皆さんのご意見に興味があります。一般的にはもっと良い方法があると思いますし、すべての点で完全に正確ではないかもしれませんので、あなたの経験を教えてください。

更新:VS 2008には、プロキシファイルにまったく新しい同一のタイプを作成するのではなく、「サービスリファレンス」を追加するときに既存のタイプを再利用するオプションがあることがわかりました。甘い。

4

4 に答える 4

4

ハイブリッドをやります。私はこのようなオブジェクトを使用します

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

次に、オブジェクトをシリアル化してから圧縮する、ちょっとしたユーティリティがあります。

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

次に、タイプ名を持つ転送オブジェクトを渡すだけです。だからあなたはこのようなことをすることができます

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

現在、圧縮シリアライザーはジェネリックスを使用して厳密に型指定されていますが、上記のoriginTypeを使用して、Typeオブジェクトを簡単に取り込んで逆シリアル化するメソッドを作成できます。これは、すべて実装によって異なります。

これがあなたにいくつかのアイデアを与えることを願っています。ああ、そしてあなたの他の質問に答えるために、wsdl.exeは型の再利用をサポートしていませんが、WCFはサポートしています。

于 2008-08-16T04:31:53.667 に答える
1

Darrenは次のように書いています。このようなオブジェクトを使用します...

興味深いアイデア...(wsdl-ed)オブジェクト自体の代わりに、オブジェクトのシリアル化されたバージョンを渡します。ある意味では、私はその優雅さが好きですが、別の方法では、Web サービスを潜在的なサードパーティやパートナーなどに公開するという目的を無効にしているように見えます. 彼らは何を渡すべきかをどうやって知るのでしょうか? ドキュメントだけに頼らなければならないのでしょうか? また、シリアライゼーションは .Net 固有であるため、「異種クライアント」の側面の一部が失われます。批判するつもりはありません。あなたが提案していることは、これらのタイプのユースケースにも意味があるかどうか疑問に思っています. 閉じた環境で使用しても問題はありません。

私はWCFを調べるべきです...私はそれを避けてきましたが、多分それは時間です。

于 2008-08-16T04:49:33.850 に答える
1

ああ、確かに、私がこれを行うのは、私がWebサービスの消費者である場合、またはオブジェクトを要求するある種のコントローラーがあり、Webサービスを直接消費するのではなく、シリアル化と送信を処理する場合のみです。しかし、実際には、Web サービスを直接使用している場合は、そもそも型を持つアセンブリを必要としないか、必ずしも持つ必要はなく、wsdl が生成するオブジェクトを使用する必要があります。

そして、はい、私が提示したものは非常に .NET 固有のものです。なぜなら、私は他のものを使用したくないからです。.net 以外で Web サービスを使用したのは JavaScript だけでしたが、今では xml Web サービス応答の代わりに json 応答のみを使用しています :)

于 2008-08-16T05:16:55.213 に答える
1

階層を分離するための議論もあります。Web サービスとの間で渡されるシリアライズ可能なオブジェクトのセットと、そのセットとビジネス オブジェクトの間でマッピングおよび変換するトランスレータを用意します。ワイヤー)

これは、Web サービス ソフトウェア ファクトリサービス ファクトリが好むアプローチであり、Web サービス インターフェイスや契約を壊すことなくビジネス オブジェクトを変更できることを意味します。

于 2008-08-21T12:31:34.190 に答える