2011-06-27 17 views
6

私の問題を返す:WCF Webサービスのシリアル化エラー - NULL値

私は、単純な.NETテストクライアントによって呼び出されているとの性質のいくつかのためにnull値を返すWCF Webサービスを持っています返されるカスタムクラス。それが返される直前にブレークポイントでの戻りオブジェクトの値を確認する

  • は、すべての値が正しく装着されていることを私に示しているが、そのオブジェクトの値はとすぐに、それが受信されると、そのプロパティのいくつかを示しますヌルである。
  • 私は同じ問題を報告している人のいくつかの他のスタックオーバーフロー投稿を読んでいますが、いくつかはインタフェースの[DataContracts]にアルファベットを付けたり注文したりすることで解決されましたが、
  • SoapUIテストを実行したときの応答でXMLに正しい値が表示されるため、値はクライアントプログラムに到達しているようです。

コード:

[ServiceContract] 
public interface IService 
{ 
    [OperationContract] 
    TotalTaxResult GetTotalTax(OrderHeader orderHeader); 
} 

[DataContract] 
public class TotalTaxResult 
{ 
    [DataMember] 
    public string Message { get; set; } 

    [DataMember] 
    public ProductLineItem[] ProductLineItems { get; set; } 

    [DataMember] 
    public string ResultCode { get; set; } 

    [DataMember] 
    public DataSet ResultDataSet { get; set; } 

    [DataMember] 
    public string strTaxLinesCount { get; set; } 

    [DataMember] 
    public DataSet taxDataSet { get; set; } 

    [DataMember(IsRequired = true)] 
    public decimal TotalTax { get; set; } 

    [DataMember] 
    public Avalara.AvaTax.Adapter.TaxService.TaxLines TotalTaxLines { get; set; } 

} 

SOAP要求

 <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/" xmlns:sal="http://schemas.datacontract.org/2004/07/SalesService"> 
    <soapenv:Header/> 
    <soapenv:Body> 
     <tem:GetTotalTax> 
     <!--Optional:--> 
     <tem:orderHeader> 
      <!--Optional:--> 
      <sal:BFCustomerNumber>123456</sal:BFCustomerNumber> 
      <!--Optional:--> 
      <sal:BFStoreNumber>654321</sal:BFStoreNumber> 
      <!--Optional:--> 
      <sal:CustomerName>Nick T</sal:CustomerName> 
      <!--Optional:--> 
      <sal:Message></sal:Message> 
      <sal:OrderLineItems> 
       <!--Zero or more repetitions:--> 
       <sal:OrderLineItem> 
        <sal:ItemNumber>164080</sal:ItemNumber> 
        <sal:LineNumber>1</sal:LineNumber> 
        <sal:Price>100</sal:Price> 
        <sal:Quantity>1</sal:Quantity> 
        <sal:TaxCode>S</sal:TaxCode> 
        <sal:UoM>CA</sal:UoM> 
       </sal:OrderLineItem> 
      </sal:OrderLineItems> 
      <!--Optional:--> 
      <sal:PONumber>333000</sal:PONumber> 
      <!--Optional:--> 
      <sal:ResultCode></sal:ResultCode> 
      <!--Optional:--> 
      <sal:SourceSystem>WEB</sal:SourceSystem> 
      <sal:TestFlag>true</sal:TestFlag> 
      <!--Optional:--> 
      <sal:TotalTax></sal:TotalTax> 
      <!--Optional:--> 
      <sal:WarehouseNum>3010</sal:WarehouseNum> 
      <!--Optional:--> 
      <sal:validDest> 
       <!--Optional:--> 
       <sal:AddressCode></sal:AddressCode> 
       <!--Optional:--> 
       <sal:AddressType>S</sal:AddressType> 
       <!--Optional:--> 
       <sal:CarrierRoute>C022</sal:CarrierRoute> 
       <!--Optional:--> 
       <sal:City>SAINT LOUIS</sal:City> 
       <!--Optional:--> 
       <sal:Country>US</sal:Country> 
       <!--Optional:--> 
       <sal:County>SAINT LOUIS</sal:County> 
       <!--Optional:--> 
       <sal:FipsCode>2918900000</sal:FipsCode> 
       <!--Optional:--> 
       <sal:Latitude>30.0000</sal:Latitude> 
       <!--Optional:--> 
       <sal:Line1>1234 DELMAR DR</sal:Line1> 
       <!--Optional:--> 
       <sal:Line2></sal:Line2> 
       <!--Optional:--> 
       <sal:Line3></sal:Line3> 
       <!--Optional:--> 
       <sal:Line4>SAINT LOUIS MO 63130-6642</sal:Line4> 
       <!--Optional:--> 
       <sal:Longitude>-95.8765</sal:Longitude> 
       <!--Optional:--> 
       <sal:PostNet>631306632524</sal:PostNet> 
       <!--Optional:--> 
       <sal:PostalCode>63130-6642</sal:PostalCode> 
       <!--Optional:--> 
       <sal:Region>MO</sal:Region> 
      </sal:validDest> 
      <!--Optional:--> 
      <sal:validOrigin> 
       <!--Optional:--> 
       <sal:AddressCode></sal:AddressCode> 
       <!--Optional:--> 
       <sal:AddressType>H</sal:AddressType> 
       <!--Optional:--> 
       <sal:CarrierRoute>R030</sal:CarrierRoute> 
       <!--Optional:--> 
       <sal:City>SAINT CHARLES</sal:City> 
       <!--Optional:--> 
       <sal:Country>US</sal:Country> 
       <!--Optional:--> 
       <sal:County>SAINT CHARLES</sal:County> 
       <!--Optional:--> 
       <sal:FipsCode></sal:FipsCode> 
       <!--Optional:--> 
       <sal:Latitude>35.8034</sal:Latitude> 
       <!--Optional:--> 
       <sal:Line1>500 ORCHARD LAKES BLVD</sal:Line1> 
       <!--Optional:--> 
       <sal:Line2></sal:Line2> 
       <!--Optional:--> 
       <sal:Line3></sal:Line3> 
       <!--Optional:--> 
       <sal:Line4>SAINT CHARLES MO 63331-4341</sal:Line4> 
       <!--Optional:--> 
       <sal:Longitude>-95.5021</sal:Longitude> 
       <!--Optional:--> 
       <sal:PostNet>63389541997</sal:PostNet> 
       <!--Optional:--> 
       <sal:PostalCode>63331-4341</sal:PostalCode> 
       <!--Optional:--> 
       <sal:Region>MO</sal:Region> 
      </sal:validOrigin> 
     </tem:orderHeader> 
     </tem:GetTotalTax> 
    </soapenv:Body> 
</soapenv:Envelope> 

SOAPレスポンス:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> 
    <s:Body> 
     <GetTotalTaxResponse xmlns="http://tempuri.org/"> 
     <GetTotalTaxResult xmlns:a="http://schemas.datacontract.org/2004/07/SalesService" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
      <a:Message>Total Tax Calc</a:Message> 
      <a:ProductLineItems i:nil="true"/> 
      <a:ResultCode>7.46</a:ResultCode> 
      <a:ResultDataSet i:nil="true"/> 
      <a:TotalTax>7.46</a:TotalTax> 
      <a:TotalTaxLines xmlns:b="http://schemas.datacontract.org/2004/07/Avalara.AvaTax.Adapter.TaxService"/> 
      <a:strTaxLinesCount>1</a:strTaxLinesCount> 
      <a:taxDataSet> 
       <xs:schema id="NewDataSet" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> 
        <xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:UseCurrentLocale="true"> 
        <xs:complexType> 
         <xs:choice minOccurs="0" maxOccurs="unbounded"> 
          <xs:element name="TaxDataTable"> 
           <xs:complexType> 
           <xs:sequence> 
            <xs:element name="TaxIndex" type="xs:int" minOccurs="0"/> 
            <xs:element name="TaxLineNo" type="xs:string" minOccurs="0"/> 
            <xs:element name="TaxCode" type="xs:string" minOccurs="0"/> 
            <xs:element name="TaxAmount" type="xs:decimal" minOccurs="0"/> 
           </xs:sequence> 
           </xs:complexType> 
          </xs:element> 
         </xs:choice> 
        </xs:complexType> 
        </xs:element> 
       </xs:schema> 
       <diffgr:diffgram xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> 
        <NewDataSet xmlns=""> 
        <TaxDataTable diffgr:id="TaxDataTable1" msdata:rowOrder="0" diffgr:hasChanges="inserted"> 
         <TaxIndex>0</TaxIndex> 
         <TaxLineNo>1</TaxLineNo> 
         <TaxCode>P0000000</TaxCode> 
         <TaxAmount>7.46</TaxAmount> 
        </TaxDataTable> 
        </NewDataSet> 
       </diffgr:diffgram> 
      </a:taxDataSet> 
     </GetTotalTaxResult> 
     </GetTotalTaxResponse> 
    </s:Body> 
</s:Envelope> 

.NETクライアント結果:用

'NULL' 値:

  • taxDataSet
  • TotalTaxが 'として返し、空のデータセットとして

    • ProductLineItems
    • strTaxLinesCountは
    • ResultDataSet戻ります0 '
    • TotalTaxLines

    その適切な値を持つ唯一のプロパティは次のとおりです。

    • メッセージ
    • のResultCode

    んが、例外は、全体の処理中にスローされません。

    [DataMember(Order = 1)]でインターフェイスを注文しても、結果には影響しません。 nullと同じプロパティが返されます。

    誰かが何か提案があれば、大変感謝しています。私はかなり.NETに慣れていないし、数日間はこの問題に対して頭を叩いています。それ以上の情報/コードスニペットが必要な場合は、私にお知らせください。前もって感謝します。

  • +0

    'WcfTestClient'は、これらの – Urda

    +0

    ような状況ではあなたの友人である私は、しかしSOAPUIから余分な詳細は私の問題、これを解決することになった、定期的にWCFTestClientを使用して行います時間。 –

    答えて

    3

    クライアントをどのように生成しましたか?クライアントを再生成または更新するだけで済みます。たとえば、クライアントを生成し、そのプロパティの1つをサーバーに追加したが、クライアントを再生成しなかった場合、その値はクライアントに戻されますが、クライアントは何がわからないため無視しますそうです。 、

    は値がが クライアントプログラムに到達しているように見える:とにかく、私の最高の推測である

    ...


    実際に、もう一度あなたの質問を読んで、あなたは次のように述べていますSoapUIテスト を実行したときの応答が の応答でXMLに正しい値が表示されるためです。しかし、あなたがnullとSOAP応答であると言う項目のリストを比較

    • ProductLineItems

    は、SOAP応答のnull:

    <a:ProductLineItems i:nil="true"/> 
    
    • TotalTaxLines

    は、SOAP応答のnull:

    <a:TotalTaxLines xmlns:b="http://schemas.datacontract.org/2004/07/Avalara.AvaTax.Adapter.TaxService"/> 
    

    だから私はそれらが実際に正しくヌルを返していることを前提としなければなりません。

    • ProductLineItem
    • Avalara.AvaTax.Adapter.TaxService.TaxLines

    これら二つのデータ:これらの非標準データ型を含むプロパティの他に


    、型も[DataContract]としてマークする必要があります、または私はISerializableも動作すると思います。

    +0

    ProductLineItemsとTotalTaxLinesについてはあなたが正しいです、それらはnullであってはなりません。 ProductLineItemsは[DataContract]とマークされていますが、TaxLinesはマークされていません。 Webサービスの定義はクライアント側で更新されます。これはWebサービスがWeb参照として追加されたシンプルなアプリケーションです。これはテストデータをどのようにフィードするかです。また、TotalTaxResult.ToxalTaxは両側の小数ですが、デフォルトでは0ですがnullではありません。 –

    0

    ProductLineItemフィールドとTaxLinesフィールドは、シリアル化された/ DataCotnractsとしてマークされているものとします。そうでない場合は、マークする必要があります。データセットについて。サーバー(小数点)とクライアント(別のもの)のデータ型が異なる場合に限り、総税額は0になります。クライアントが操作しているインターフェイスを確認する必要があります(これがプロキシでない場合)。 データセットに関しても同じですが、DataSetタイプが参照されたライブラリのリストにない場合にのみDataSetsでいくつかの問題が発生しました。したがって、.NETはプロキシ型で動作する必要があります。

    +0

    TotalTaxはサービス側とクライアント側の小数ですが、ProductLineItemはDataContractとしてマークされていますが、TaxLinesはこれまでのところはありませんが、私はそれを試みます。 DataSetsの問題をどのように解決したか覚えていますか?応答していただきありがとうございます。 –

    +0

    サービス契約インターフェースを別のライブラリー(使用していたタイプと一緒に)に移動し、このライブラリーをクライアントに出荷することで、クライアントの問題を解決しました。これは、自動生成プロキシを使用するよりも優れた方法です。私はそれが助けてくれることを願っています.. –

    0

    ありがとうございます。

    なぜ私はそれが働いたのか正確には分かりませんが、私の問題は解決しました。

    TotalTaxResultのtaxDataSetプロパティをDataContractとして設定しましたが、使用していませんでした。単にtaxDataSetプロパティを取り出すだけで、私の問題は完全に解決されました。私は、XML Serializationのルールがないと確信しています。繰り返しの問題を防ぐための説明は素晴らしいでしょう。

    もう一度おねがいします。

    0

    これは、実際にデータセットをシリアル化する必要がある他の人に役立つことを願って、これが私の解決策です。

    Serializable属性を使用するだけでなく、IXmlSerializableを実装してカスタム型をデータセット内で適切にシリアル化する必要があります。私のデータセットは、IXmlSerializableを実装するまで、カスタム型の空の列で戻ってきました。

    UDTは、XMLシリアル化の契約に準拠してxmlデータ型との変換をサポートする必要があります。 System.Xml.Serialization名前空間には、オブジェクトをXML形式のドキュメントまたはストリームにシリアル化するために使用されるクラスが含まれています。 XML直列化および逆シリアル化のカスタム書式設定を提供するIXmlSerializableインターフェイスを使用して、xmlシリアル化を実装することができます。

    XMLにUDTから明示的な変換を実行することに加えて、XMLシリアル化は、あなたがすることができます:XMLデータ型に変換した後UDTインスタンスの値よ​​り

    使用Xqueryの。

    SQL ServerのネイティブXML Webサービスでパラメータ化されたクエリとWebメソッドでUDTを使用します。

    UDTを使用して、XMLデータの一括読み込みを受信します。

    UDT列を含む表を含むシリアル化データセット。

    UDTはFOR XMLクエリでシリアル化されません。 UDTのXMLシリアル化を表示するFOR XMLクエリを実行するには、明示的に各UDT列をSELECTステートメントのxmlデータ型に変換します。明示的に列をvarbinary、varchar、またはnvarcharに変換することもできます。 IXmlSerializable の

    http://technet.microsoft.com/en-us/library/ms131082.aspx

    シンプルな実装http://msdn.microsoft.com/en-us/library/system.xml.serialization.ixmlserializable.aspx

    関連する問題