0

SOAP 経由でデータ レコードを取得する単純なアプリケーションがあります。SOAP Web サービスは、「サービス参照」を介してプロジェクトに追加されました。通話は正常に機能します。0000-00-00参照コードがオブジェクトに格納する日付の値をデータが保持している場合に問題がありますDateTime。クラスは、SOAP 呼び出しからの応答を逆シリアル化する際に最終的にエラーにつながるDateTime最小値を予見しました。0001-0-01

SOAP 経由でデータをプルするために実行されるコードは次のとおりです。

TopixSOAP.TOPIXRPCClient soap = new TopixSOAP.TOPIXRPCClient();
soap.GetProjekt(out error_code, out start_date, out end_date, instance, user, passwd, project_number);

したがって、必要な情報を SOAP 呼び出しに提供すると、start_date と end_date が => の場合に適切に実行されます0001-01-01。ただし、データには日付の値が含まれることがあるため、値をオブジェクト0000-00-00に逆シリアル化すると、アプリケーションが自然にクラッシュします。DateTime

すべての出力パラメーターを TopixProject という別のクラスにラップしようとしました。

public class TOPIXProject
{

    public TOPIXProject()
    {
    }
    public string ErrorCode
    {
        get
        {
            return ErrorCode;
        }
        set
        {
            ErrorCode = value;
        }
    }

    public DateTime StartDate
    {
        get
        {
            return StartDate; 
        }
        set
        {
            StartDate = DateTime.MinValue;
        }
    }

    public DateTime EndDate
    {
        get
        {
            return EndDate;
        }
        set
        {
            EndDate = DateTime.MinValue;
        }
    }

変更された呼び出しは次のとおりです。

soap.SOAP_GetProject(out p.ErrorCode, out p.StartDate, out p.EndDate, instance, user, passwd, project_number);

クラスは値をに設定する必要があるDateTime.MinValueため、エラーは発生しません。意図したとおりに機能しません。クラスのメンバーはTOPIXProject、関数の out または ref パラメーターとして使用できません。

SOAP 呼び出しの前に宣言する「生の」out 変数を提供すると、日付がクラス定義の有効な範囲 (=> 0001-01-01)内にある場合に機能します。DateTime

string error_code = "";
DateTime start_date, end_date;
soap.GetProjekt(out error_code, out start_date, out end_date, instance, user, passwd, project_number);

しかし、日付が変更できないデータレコードがたくさんあります0000-00-00(これは、終了不可能なプロジェクトの内部マーキングです)。では、有効な SOAP 応答を取得するにはどうすればよいでしょうか?

  • 主に、データセットの日付0000-00-00を取得したい場合DateTime.MinValue
  • または、すべてを文字列として解釈するようにサービス参照に指示できますか? (サービス参照がコード自体をビルドし、xsd:date タイプを DateTime に解析しようとするため、これは私の場合はかなり悪いことです)

編集:

ここで、サービス参照からの SOAP 呼び出しの一部を使用します (基本的に、日付が戻されないすべての呼び出し)。残りは、SOAP エンドポイントに必要な呼び出しを提供し、ほとんどが文字列または XML を返す SOAPHelper クラスを実装しました。コード例はこちら

4

2 に答える 2

1

最良の選択は、手動で (または Svcutilツールを使用して) クライアント側を生成し、datetime の代わりにメッセージを受信するようにコントラクトを変更することです。そうすれば、メッセージ自体を操作して、無効な日時の値を処理できます。msdn でメッセージ コントラクトを使用する方法の詳細については、こちらの機能の使用に関する素敵な投稿があります。

于 2013-06-03T11:23:58.583 に答える