2

Webサービスを作成するときに、使用するタイプを指定する方法はありますか?具体的には、クライアントとサーバーの両方で同じタイプを使用して、コードの重複を減らすことができるようにしたいと考えています。

簡略化した例:

    public class Name
    {
        public string FirstName {get; set;}
        public string Surname { get; set; }

        public override string ToString()
        {
            return string.Concat(FirstName, " ", Surname);
        }
    }

クラスの機能の一部を再コーディングしたくありません。もう1つは、生成されるクライアント側クラスは別のタイプであるため、このクラスを操作する存在するコードはクライアント側では機能しないということです。

4

2 に答える 2

3

これは SOAP 側の明示的な設計上の決定であることはわかっているので、実際にこれを行うべきではありません。その理由を説明している次のページを見つけました。

サービスは、 class ではなくスキーマとコントラクトを共有します。サービスは、スキーマによる構造の表現とコントラクトによる動作のみで相互作用します。サービスのコントラクトは、メッセージの構造とメッセージに対する順序付けの制約を記述します。式の形式により、着信メッセージのマシン検証が可能になります。着信メッセージのマシン検証により、サービスの整合性を保護できます。コントラクトとスキーマは長期にわたって安定していなければならないため、それらを柔軟に構築することが重要です。

他に2つの可能性があると言った:

  1. Visual Studio または wsdl.exe を使用して Web 参照を生成します。次に、生成された Reference.cs (または .vb) ファイルに移動し、型を明示的に削除します。次に、別のアセンブリにある目的の型にリダイレクトします。
  2. wsdl.exe と /sharetypes パラメーターを使用して、クライアント側の Web サービス間で型を共有できます。
于 2008-09-27T06:26:50.790 に答える
0

Web サービスとクライアントの間でタイプまたは構造を共有したい場合は、次のように public struct を Web サービス プロジェクトに追加します。

public struct Whatever
{
    public string A;
    public int B;
}

次に、この構造体を戻り値の型として持つメソッドを Web サービスに追加します。

[WebMethod]
public Whatever GiveMeWhatever()
{
    Whatever what = new Whatever();
    what.A = "A";
    what.B = 42;
    return what;
}

クライアントの Web 参照を更新した後、次のように、クライアント アプリケーションで Whatever 型の構造体を作成できるようになります。

Webreference.Whatever what = new Webreference.Whatever();
what.A = "that works?";
what.B = -1; // FILENOTFOUND

この手法を使用すると、1 つの場所 (Web サービス プロジェクト) でやり取りする必要がある構造の定義を維持できます。

于 2008-09-24T15:34:42.117 に答える