2009-07-02 3 views
1

を書くのは、私は、このようなは手動でWCFのPOXの記事に

[ServiceContract] 
public interface IContract 
{ 
    [OperationContract] 
    [WebInvoke(Method="POST", RequestFormat=WebMessageFormat.Xml, BodyStyle=WebMessageBodyStyle.Wrapped)] 
    string ComplexPost(string name, ComplexType data); 
} 

そして、データコントラクトとしてWCFの契約を結んでいるとしましょう:

[DataContract(Name="ComplexType", Namespace="")] // don't know if those atts are req'd or not but saw them in another example 
public class ComplexType 
{ 
    public string StringData { get; set; } 
    public int IntData { get; set; } 
    public DateTime DateValue { get; set; } 
} 

私は要求がより多くを持っているために包まれなければならないことを知っています明らかに1つ以上のルートを持つXML文書を持つことはできません。

問題は、ドキュメンテーションが本当にあなたがそれをラップする必要があるかどうかについてはまばらです。

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

明らかに私はComplexPostという名前(メソッド名と同じ)を持つ要素が名前空間http://tempuri.org/であることを期待していることを私は知ることができます。

<ComplexPost xmlns="http://tempuri.org/"> 

...what exactly? 

</ComplexPost> 

目標は、特にRESTの原則を遵守することではありません。私は、UriTemplateにいくつかのパラメータを埋め込んだ答えを探しているのではなく、ただ一つの複雑なオブジェクトを残して、Bareの仕事をしています。私は、POST本体内のすべてのデータを含む一般的な解決策を探しています。ここではフィドラー

で見つかり

は、私がバイオリンを使用して見つけたものに基づいて、結果がどうなるか程度です。

<ComplexPost xmlns="http://tempuri.org/"> 
    <name>Value of name parameter</name> 
    <data xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
     <StringData>The StringData property value</StringData> 
     <IntData>10</IntData> 
     <DateValue>2009-07-07T15:38:39.7738012-05:00</DateValue> 
    </data> 
<ComplexPost> 

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

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

nullable DateTimeなどのnull可能な値でテストを行いました。どうやらxmlns:i = "http://www.w3.org/2001/XMLSchema-instance"という宣言は、それが必要となる前に発生していなければなりません。そして、null値の場合、それはi:nil = "true"たとえば、

<NullableDateProperty i:nil="true" /> 

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

.... 
<ChildObjectPropertyName> 
    <PropertyOfChildObject>value</PropertyOfChildObject> 
    ... 
</ChildObjectPropertyName> 
<ListProperty> 
    <ObjectType> 
     <ObjectProperty>value</ObjectProperty> 
     .... 
    </ObjectType> 
    ... 
</ListProperty> 

この

は完全ではないかもしれませんが、レッスンは間違いなく作業WCFクライアントを取得し、フィドラーとの交流を調べています。ありがとう、チーズ!

答えて

1

私がWCFベースのREST/POXサービスを公開していて、それを "誰と何か"で消耗させたいのであれば、Fiddler2のようなデバッグHTTPプロキシを使用し、 WCF RESTクライアントからWCF RESTサーバーに移動します。

これは、ドキュメンテーションとサンプルの開始の基礎となり、スクリプトテストのセットになります。

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

私はかなりここにあなたの目標を理解していない
+0

Fiddler2を使用すると効果的でした!質問を編集して私が見つけたものを表示します。 –

1

.....

「ノーマル」WCFサービスは、SOAPサービスである - 例えば - SOAPを話す何か他のものと本質的に相互運用が可能ですJava、PHP - 名前を付けますあなたはWCFサービスを作成し、DataContractを本格的なSOAPサービスとし、クライアントと相互運用できるだけではありませんか?

もしそうでなければ、基本的に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要素と衝突しないことを確かめてください。

両方の属性はオプションです。必要でない場合は、属性を指定する必要はありません。

マーク