2012-01-22 13 views
0

は私がサービス応答のために、このようなXSD与えました。WCF応答メッセージをカスタマイズ

[ServiceContract] 
[XmlSerializerFormat] 
public interface IService 
{ 
    [OperationContract] 
    [return:XmlElement("return")] 
    bool AddEdit(MultipleElements elements); 
} 

私はてaddEdit操作の戻り値にのXmlElement属性を適用し、私はまだ、次のXSDを取得しています:

<xs:element name="AddEditResponse"> 
    <xs:complexType> 
     <xs:sequence> 
      <xs:element minOccurs="1" maxOccurs="1" name="AddEditResult" type="xs:boolean"/> 
     </xs:sequence> 
    </xs:complexType> 
</xs:element> 

AddEditResponse要素内の要素の名前は関係なく、同じまま[return:XmlElement]属性のnameです。

どうしてですか? WCFでこのようなデータ交換フォーマットの詳細をカスタマイズする方法はありますか?

ありがとうございました。

答えて

1

私はsvcutilに契約を結ばせることでこれにアプローチします。役立つかどうかを確認してください...

少なくとも1回の操作で、AddEditメソッドに一致するWSDLファイルを生成する必要があるスキーマを使用してください。

次のようなコマンドライン(私の場合、私が使用しているツールは3つのWSDLファイルにXSDファイルを参照するものを生成)とsvcutilを実行する、ことをしたら:

svcutil /mc AddEditSoapHttp.wsdl AddEditSoapBinding.wsdl AddEditInterface.wsdl WCF-WSDLFirst.xsd 

結果は何かをする必要がありますこのように:

Microsoft (R) Service Model Metadata Tool 
[Microsoft (R) Windows (R) Communication Foundation, Version 4.0.30319.1] 
Copyright (c) Microsoft Corporation. All rights reserved. 

Generating files... 
....\AddEditSoapHttpService.cs 
....\output.config 

あなたの質問への回答を見つけるために、生成されたコードを見てください。私は(私は唯一の抜粋を掲載しています)取得しています

<?xml version="1.0" encoding="utf-8" ?> 
<xs:schema targetNamespace="http://tempuri.org/XMLSchema.xsd" elementFormDefault="qualified" xmlns="http://tempuri.org/XMLSchema.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="AddEditRequest"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element minOccurs="1" maxOccurs="1" name="request" type="xs:string"/> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 
    <xs:element name="AddEditResponse"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element minOccurs="1" maxOccurs="1" name="response" type="xs:boolean"/> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 
</xs:schema> 

:このXSD(例として、要求/応答のペアを示す)については

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")] 
[System.ServiceModel.ServiceContractAttribute(Namespace="http://tempuri.org/ifx/addedit/interface/1/", ConfigurationName="AddEditPortType")] 
public interface AddEditPortType 
{ 

    [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/ifx/addedit/bindings/1/AddEdit", ReplyAction="*")] 
    [System.ServiceModel.XmlSerializerFormatAttribute()] 
    AddEditResponse1 AddEdit(AddEditRequest1 request); 
} 
+0

おかげで、これはどのような私です欲しかった私はWCFが初めてで、私はsvcutilについて知らなかった。ただし、データ契約ではなくメッセージ契約が生成されました。 "メッセージのモデル化に使用された命名規則がWCF標準と異なる場合、コード生成ツールは要求と応答のMessageContractクラスを生成します" - [this](http://msdn.microsoft.com/en-us/)雑誌/ ee335699.aspx)の記事をご覧ください。 –

関連する問題