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 クラスを実装しました。コード例はこちら