2009-07-23 14 views
0

私は現在、私の会社が提供しているwebserviceの新しいバージョンを構築中です。現在のWebサービスには、string型の入力パラメータがあります。その文字列では、XML文書全体が渡されます。次に、その文字列をxsd(消費者に与えられた同じxsd)に対して検証します。C#.net 2.0 WebServiceの複雑な型の入力パラメータを記述する正しい方法は何ですか?

[WebMethod] 
public bool Upload(string xml) 
{ 
    if (ValidateXML(xml)) 
    { 
     //Do something 
    } 
} 

私はこのサービスの次のバージョンを構築しています。 XML文書を文字列として渡すことは正しい方法ではないという印象を受けました。

[WebMethod] 
public bool Upload(int referenceID, string referenceName, //etc...) 
{ 
    //Do something 
} 

私が午前この問題は、実際には入力パラメータが大量にあるということです、そのうちのいくつかは、複雑なタイプです:私は私のサービスは、次のようになりますことを考えていました。たとえば、アップロードメソッドは、割り当てという複雑なオブジェクトを取り込む必要があります。このオブジェクトは、実際にはいくつかの整数、小数点、文字列、その他の複雑なオブジェクトで構成されています。私はこのようにwebserviceを構築する必要があります:

[WebMethod] 
public bool Upload(int referenceID, string referenceName, Allocation referenceAllocation) 
{ 
    //Do something 
} 

またはこれとは別の方法がありますか?

注:この割り当てオブジェクトには、古いサービス用に提供されたxsd内の階層があります。

オリジナルのサービスがこの問題に対処するためにXMLを取り入れただけかもしれませんか?複雑な型をWebサービスに取り込むためのより良い方法はありますか?

注:これはC#2.0 Webサービスです。

答えて

1

"xsd.exe"ツールでXSDを使用してXMLシリアル化可能オブジェクトを作成するのはおそらくでしょう。次に、文字列パラメータの代わりにオブジェクトを扱うことができます。また、WebServiceのシグネチャを変更しないようにすることもできます。

XSDを変更して別のパラメータを追加する場合は、XSD.exeツールを使用してクラスを再作成するだけです。 部分クラスをここでよく活用してください。自動生成されたクラスとビジネスロジックを分離します。こうすることで、XSDが必要な回数だけ変更され、ビジネスロジックには触れない場合、クラス定義を再作成できます。

XML Serialization in the .NET Framework

あなたが3.5を使用していた場合は、すぐにあなたのXMLパラメータを解析するためにXMLにLINQを使用することができます。

+0

消費者がどのコーディング言語を使用しているのか分かりませんか? Javaを使用するクライアントや.NETを使用する他のクライアントがあります – Jon

+0

*あなたのコード*が特定のXMLを期待している場合は、xml文字列として渡されます。オブジェクトにデシリアライズして戻します。あなたのクライアントのすべてがあなたが提供したXSDに従えば、それは問題ではありません。 –

+0

はい、クライアントにWSDLとXSDを提供し、XMLを自分で解析しないでください! LINQ to XMLは間違いなく、ここでは過剰です(.NET 2.0では使用できません)。元の質問のWebメソッドのレスポンスやリクエストクラスなどのオブジェクトを直列化するには、* [XmlRoot] *、* [XmlElement] *、* [XmlArrayItem] *などの属性を適切な場所に適用するだけで済みません。 – azheglov

0

複合型が何らかの形でXmlSerializableになっている限り、これらの複合型を使用するだけで問題はありません。フレームワークはあなたのために重労働をさせてください。適切なWSDLが生成され、検証と直列化について心配するのではなく、データ自体がすべてシリアル化されます。

[Serializable]はあなたの友人です。

+0

消費者がどのコーディング言語を使用しているのか分かりませんか? Javaを使用しているクライアントや.NETを使用している他のクライアントがあります。 – Jon

+0

...言語が有効なXMLでサービスを呼び出す限り、サービスはうまく動作するはずです。 –

1

Jon、あなたのフォローアップの質問にまず答えてください。クライアントが複数のプラットフォーム(または少なくとも.NETのすべてではない)の場合、最善の方法はいわゆる「WSDL-first」です。 WSDLはサービスとメソッドが定義されるWSDLで定義されます。WSDLは、これらのメソッドに渡され、返されるデータ保持オブジェクトを定義する一連のXSDを参照します。 WSDL/XSDからC#またはJavaコードを生成できます。

元の質問に戻ってください。メンテナンス性を維持するために、各Webメソッドに対してRequestクラスとResponseクラスを定義し、文字列、bool、整数を直接渡すことは避けてください。あなたはWSDLファイルにSOAPバインディングを定義した場合たとえば、

// in your Web service class 
[WebMethod] 
public UploadResponse Upload(UploadRequest request) { 
    ... 
} 
... 

[Serializable] 
public class UploadResponse { 
    public bool IsSuccessful { 
    get { ... } 
    set { ... } 
    } 
} 

[Serializable] 
public class UploadRequest { 
    public Allocation ReferenceAllocation { 
    get { ... } 
    set { ... } 
    } 
    // define other request properties 
    // ... 
} 

は、UploadRequestオブジェクトは、SOAPメッセージから抽出し、デシリアライズされます。コントロールがWebMethod実装に到達するまでに、デシリアライズされたUploadRequestオブジェクトがすべてのプロパティが設定された状態でメモリに格納されます。

[WebService]クラスのpublic bool Upload(文字列xml)とメソッド実装内のXMLを解析することは、間違いなく離れていくことを検討する必要があります。

関連する問題