30

問題:

外部システムからの呼び出しのエンドポイントとなるWCFサービスをセットアップしています。呼び出しはプレーンxmlを送信しています。RequestBuilderを使用してFiddlerからサービスに呼び出しを送信することにより、システムをテストしています。

問題は、2つのフィールドを除いて、すべてのフィールドが逆シリアル化されていることです。price_retailおよびprice_wholesale

私は何が欠けていますか?他のすべてのフィールドは問題なく逆シリアル化されます-サービスは応答します。これらのフィールドだけです。

XMLメッセージ:

<widget_conclusion>
    <list_criteria_id>123</list_criteria_id>
    <list_type>consumer</list_type>
    <qty>500</qty>
    <price_retail>50.00</price_retail>
    <price_wholesale>40.00</price_wholesale>
    <session_id>123456789</session_id>
</widget_conclusion>

サービス方法:

public string WidgetConclusion(ConclusionMessage message)
{
    var priceRetail = message.PriceRetail;
}

メッセージクラス:

[DataContract(Name = "widget_conclusion", Namespace = "")]
public class ConclusionMessage  
{
    [DataMember(Name = "list_criteria_id")]
    public int CriteriaId  { get; set;}
    [DataMember(Name = "list_type")]
    public string ListType { get; set; }
    [DataMember(Name = "qty")]
    public int ListQuantity { get; set; }
    [DataMember(Name = "price_retail")]
    public decimal PriceRetail { get; set; }
    [DataMember(Name = "price_wholesale")]
    public decimal PriceWholesale { get; set; }
    [DataMember(Name = "session_id")]
    public string SessionId { get; set; }
}
4

2 に答える 2

55

メッセージのフィールドの順序が間違っています。DataContractsのデフォルトは、宣言の順序ではなくアルファベット順です。XML要素がこの順序で到着することを期待します。故障した要素は通常破棄されます。

コントラクトを修正して(DataMemberAttributeのOrderプロパティを使用して)正しい順序を明示的に指定するか、クライアントが正しい順序でそれらを送信することを確認します。

于 2010-03-25T22:49:54.747 に答える
0

DataContractSerializerの代わりにXmlSerializerを使用してみることができます。私の場合、global.asaxファイルのデフォルトエンジンを変更する必要があります。

var xml = GlobalConfiguration.Configuration.Formatters.XmlFormatter;
xml.UseXmlSerializer = true;

一部のXMLは無効になる可能性があるため、これは慎重に行ってください。たとえば、XmlSerializerを使用する名前空間は次のように決定する必要があります。

[XmlNamespaceDeclarations] 
private XmlSerializerNamespaces xmlns 
{  
  get {
    var xns = new XmlSerializerNamespaces();
    xns.Add("i", "http://www.w3.org/2001/XMLSchema-instance");
    return xns;
  }    
  set { } 
}

または、 XmlSerializerFormatAtrributeをYouクラスに設定できます(私には機能しません)。URLヘッド「手動でXmlSerializerに切り替える」を確認してください

于 2017-10-24T11:35:31.577 に答える