7

私はアプリを持っています。ここでは、WSDL からクライアント サービスを生成します。現在、一部の機能は正常に動作します。しかし、いくつかは間違っています。

WSDLの一部です

<xs:complexType name="TStartInfoCalcZoneViewForArea">
   <xs:sequence>
      <xs:element minOccurs="0" name="ID" type="xs:int"/>
      <xs:element minOccurs="0" name="startFreq" type="xs:double"/>
      <xs:element minOccurs="0" name="endFreq" type="xs:double"/>
      <xs:element minOccurs="0" name="startTime" type="xs:string"/>

それはC#の一部です

public partial class TStartInfoCalcZoneViewForArea
{

    private int idField;

    private bool idFieldSpecified;

    private double startFreqField;

    private bool startFreqFieldSpecified;

    private double endFreqField;

    private bool endFreqFieldSpecified;
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(Order=0)]
public int ID
{
    get
    {
        return this.idField;
    }
    set
    {
        this.idField = value;
    }
}

/// <remarks/>
[System.Xml.Serialization.XmlIgnoreAttribute()]
public bool IDSpecified
{
    get
    {
        return this.idFieldSpecified;
    }
    set
    {
        this.idFieldSpecified = value;
    }
}

このフィールドに値を設定します。例えば

.ID = 100;
.IDSpecified = true; // I set nothing, false. But result is same.

問題は、このすべてのフィールド (ID、endFreq、startFreq) が gsoap サーバーで null であることです。

この問題の原因は何ですか? どうすれば修正できますか?

更新 - 理由と解決策

問題は、「gsoap サーバー」のソース コードを持っていないことです。ただし、当社での契約上、本アプリからのログを利用(視聴可能)しています。このログは正しくありません (まず、この状況ではログ メッセージがありません。次に、このメッセージが正しくありませんでした。修正後、問題は解決されました)。

また、「double」フィールドを持つ多くのクラスと構造があります。そのため、一部のクラスのインスタンスでは、「...Specified = true;」を設定しました。別のケースでは、「...Specified = true;」を設定しません。ログが修正された後、問題が表示されます。

したがって、「...Specified = true;」を設定する必要があります。すべてのクラスで。この解決策が正しいかどうかはわかりません。

1) 社内の別のプログラマーに聞いてみたが、彼らは wcf normal を知らない。

2) "...Specified = true;" を設定しますが、ログに同じメッセージが表示されます。

4

1 に答える 1

19

問題は次のとおりです。フィールドidFieldのタイプintは であるため、.NET では null にすることはできません。常に有効な整数値 (0 など) が必要です。

一方、XML スキーマでは、オプションとして次のように定義されています。

<xs:element minOccurs="0" name="ID" type="xs:int"/>

そのため、.NET クライアントが、そのの値が値が定義されていないことを意味するのか ( があるため0) 、または本当に値をサーバーに送信するつもりなのかを知る方法はありません。idFieldminOccurs=00

そこでidFieldSpecified出番です:

  • idFieldis0かつidFieldSpecifiedis false-->値が定義されていない場合(たとえば、SQL の場合と少し似NULLています)

  • idFieldある場合-->呼び出し元に値を送信したい場合0idFieldSpecifiedtrue0

したがって、付随するフィールドを持つフィールドがあり、(field)Specified実際に値を送信したい場合は、値をtrueに設定する必要があります。そうしないと、値セットは送信されません。(field)Specified

于 2013-10-22T13:40:45.313 に答える