0

我使用用 C# 编写的 Web 服务,在我的(客户端)端使用 PHP。

SOAP将预期参数之一__getTypes返回为. 我试图以不同的方式发送参数,比如dateTime birthDate

$date = new DateTime("now");
$wsclient->SomeFunction(array($date->format("Y-m-d\TH:i:s"));

或者$date->format('c')我什至把它写成一个字符串1932-11-12T00:00:00等等。我没有得到肥皂异常,但函数返回接收到的birthDate值是0001-01-01T00:00:00.

我与 Web 服务的开发人员进行了一次会议,他向我展示了当他将System.DateTime类型变量传递给函数时,它可以正常工作,但他是在 C# 本地而不是通过 Web 服务上做的,只是做

date = new DateTime(1999,9,9,0,0,0);
SomeFunction(date);

我想知道的是如何DateTime从 PHP 传递 c# 类型。我想我用$date->format('c')或 做对了$date->format("Y-m-d\TH:i:s")

我只是想确保这部分代码是正确的,如果是,请在其他地方搜索问题。

更新:我们得出的结论是:他们改变了自己的代码。数据类型保持不变(DateTime),我不知道他们在那里做了什么,但如果我得到任何信息,我会及时更新这篇文章。

几年后:他们只是不知道他们在做什么,我被一个问题困住了,这在我身边是不可能解决的。如果 WSDL 请求DateTime并且您正确地发送了它(SOAP 不会抛出异常)并且它不能正常工作,那么您肯定应该在另一端寻找问题。

4

3 回答 3

2

“...我与 Web 服务的开发人员会面,他向我展示了当他将System.DateTime类型变量传递给函数时,它可以正常工作,但他是在 C# 本地完成的......”

您尝试在 C# Web 服务中调用的函数将System.DateTime对象作为参数。我在MSDN上查了一下,得知它是一个 C# 类。PHP 的DateTime 类不一样,因此服务可能会将 PHP 的 DateTime 类的实例识别为无效数据。我不确定 C# 服务如何进行通信,但我认为它需要 C# System.DateTime 对象的二进制表示。这意味着您可能会研究 C# 的 System.DateTime 对象如何以二进制表示,并在 PHP 中手动构造和传递二进制数据。然而,这非常耗时,而且您无法保证它会真正起作用。

更好的解决方案是在 Web 服务(如果存在)中使用另一个函数,将原始数据类型作为参数而不是 C# 特定类检索。一个示例是 Web 服务中的一个类似函数,它检索 Unix 时间戳(在 PHP 中:time()),该函数可以使用它来创建自己的 System.DateTime C# 对象。另一个示例可能是从格式化字符串(例如“dd.mm.yyy H:i:s”)中检索日期的函数。

如果您能够收回 Web 服务开发人员的本地代码/示例(您提到的那个)并将其发布在此处,那么对您的帮助会更容易。

于 2013-09-10T12:22:15.160 回答
0

对于我们使用的一项 Web 服务,该服务允许使用带有 DateTime 对象的 createdAt 时间戳过滤条目。我发现使用这个可能有点笨拙,但是:

$date = new stdClass();
$date->DateTime = '2012-01-01T00:00:00Z';
$date->OffsetMinutes = -480; // Los Angeles offset also can just be set to NULL

那么参数可能是:

$params = array(
 'birthDate' => $date
);

我一直在寻找使用 PHP 的本机 DateTime 对象的方法,但可以找到更简单的方法。

希望这可以帮助。

于 2014-09-26T14:33:49.713 回答
0

只需使用:date('Y-m-d\TH:i:s', $dob);

于 2015-05-29T09:20:15.850 回答