1


0

次のようなWCF契約があるとしましょう。

[ServiceContract]
パブリックインターフェイスIContract {[OperationContract] [WebInvoke(メソッド= "POST"、RequestFormat = WebMessageFormat.Xml、BodyStyle = WebMessageBodyStyle.Wrapped)]文字列ComplexPost(文字列名、ComplexTypeデータ); }

そしてデータ契約:

[DataContract(Name="ComplexType", Namespace="")]
//これらの属性が必須かどうかはわかりませんが、別の例で見てみました。public class ComplexType {public string StringData {get;}セット; } public int IntData {get;};セット; } public DateTime DateValue {get;}セット; }}

私は、リクエストが複数の入力パラメータを持つためにラップされなければならないことを知っています、明らかにあなたは複数のルートを持つXMLドキュメントを持つことはできません。

問題は、それをWITHでラップする必要があるものについてのドキュメントは本当にまばらです。

目標はWCFでこれを消費することではなく、一般的なXML Webサービスとしてクライアントにアクセス可能である必要があります。 彼らはWCFの知識がなくても.NETを使用することさえありません。

私が受け取っている例外から、名前がhttp://tempuri.org/のComplexPost(メソッド名と同じ)という名前のElementがあることを期待しているという例外からわかることは明らかです。私はこれが必要だということを知っています:

...what exactly?

目標は、特にRESTの原則に従うことではありません。 UriTemplateにいくつかのパラメーターを埋め込んで複雑なオブジェクトを1つだけ残して、Bareを機能させるような答えを探しているのではありません。 私はPOSTの本文にすべてのデータを含めるための一般的な解決策を探しています。

  • Fiddlerで見つけました*

私がFiddlerを使って見つけたものに基づいて、これはおおよそ結果がどうなるかです。

nameパラメータの値StringDataプロパティ値10 2009-07-07T15:38:39.7738012-05:00

したがって、wrapper要素は、ServiceContractで指定されているXML名前空間を持つメソッド名、またはそうでない場合はtemppuri.orgです。

各パラメータは順番に子要素になり、基本型は文字列表現に非常に簡単にシリアル化されます。

NULL可能なDateTimeを含む、NULL可能な値を使用してテストを行いました。 明らかに、xmlns:i = "http://www.w3.org/2001/XMLSchema-instance"という宣言は、必要になる前に行わなければなりません。そして、null値の場合は、i:nil = "true"の閉じた要素です。 、 例えば


DataContractオブジェクトが子の複合型、または複合オブジェクトのリストを持つことも非常に簡単でした。


値…​

値…​. …​

これは完全ではないかもしれませんが、レッスンは間違いなくWCFクライアントを機能させてからFiddlerとのやり取りを調べることです。 Cheesoありがとうございます!

2 Answer


1


私がこれをしていて、WCFベースのREST / POXサービスを公開していて、「誰でも何でも」でそれを消費できるようにしたかったのです。そして、WCF RESTクライアントからWCF RESTサーバーへの成功した要求をキャプチャします。

それは、一連のスクリプトテストと同様に、ドキュメントと例の始まりの基礎になることができます。

WCF自体でメッセージトレースを有効にする方法もありますが、私は知りません。 私はいつもFiddlerを使っています。 実際、私は今それを開いています。


1


ここであなたの目標はよくわかりません……

「通常の」WCFサービスはSOAPサービスです。これは、SOAPを話す他のものと本質的に相互運用可能です。 Java、PHP - あなたはそれに名前を付けます。 本格的なSOAPサービスになるようにWCFサービスとそれに付随するDataContractを作成し、クライアントと相互運用するだけでは不十分ですか。

そうでない場合 - RESTを使用すると基本的に起こることは、DataContract(サービスのデータ表現)がDataContractSerializerによってXMLに直列化されることです。 このスニペットを使用して、コード内でこれを手動で簡単にテストできます。

DataContractSerializer dcs = new DataContractSerializer(typeof(YourDataContract));

FileStream outputFile = new FileStream(@ "C:\ output.xml"); dcs.WriteObject(outputFile、yourTestDataInstance);

シリアル化された "yourTestDataInstance"(タイプ "YourDataContract")の出力はC:\ output.xmlに書き込まれ、検査の準備が整いました。

もちろん、サービスURLを参照するとRESTの結果を見ることができます。 それで、あなたは結果を少し微調整する必要があるかもしれません - しかし、あなたはあなたが興味を持っていることを容易に達成することができるべきです。

DataContractの "Name ="属性を使用すると、XMLのルート要素に別の名前を指定できます。 "YourDataContract"の代わりに "Root"が必要な場合は、 "Name = Root"属性を使用してください。

Namespace =属性を使用すると、データコントラクトを独自の別のXMLネームスペースにまとめることができます。NETネームスペースと同様に、データを明確にして独自のものにすることができます。 「顧客」は、他の場所からの「顧客」と呼ばれる別のXML要素と衝突することはありません。

両方の属性はオプションです - 必要がなければ指定する必要はありません。

マーク