Ошибка при получении PHP неверной даты из веб-службы C # - PullRequest
0 голосов
/ 08 июня 2009

Хорошо, это сводит меня с ума уже около 12 часов. У меня есть веб-служба C #, работающая под IIS 7, и я подключаюсь к нему через PHP на коробке Apache 2.2. Не то, чтобы что-то из этого действительно имело значение, но подумал, что я бросил бы это.

Теперь, когда я захожу прямо в веб-сервис и вызываю его, я получаю правильный формат даты и времени, но если я вызываю его из php, то нет.

Пример:

C # WebService: 04.06.2009 9:23:25 AM

PHP Мыло Результат: 31.12.16, 16:00


WebService оценивает WMI :: Win32_LogonSession для получения StartTime, а затем преобразуется через ManagementDateTimeConverter.ToDateTime ((строка) wmisearcherData ["StartTime"]) а затем установить в строку.

Я в растерянности, и все, что кто-либо может предложить, будет большой помощью.

Спасибо

Ответы [ 2 ]

0 голосов
/ 08 июня 2009

Я не думаю, что это неправильное время. PHP получает «совсем нет времени», а значение времени, которое вы видите, является значением по умолчанию. Начало эпохи, как говорится. Независимо от того, какую ценность вы отправите, это всегда будет в одно и то же время. Это произойдет, если формат XML, отправляемого по проводам, не соответствует ожиданиям клиента PHP. На самом деле это верно для любой пары взаимодействующих платформ, а не только для C # и PHP.

Когда вы используете прокси-библиотеку веб-службы, код неявно отображает входящие и исходящие переменные во входящие и исходящие XML-документы (или, точнее, XML-фрагменты). Иногда приложения выполняют XML-сериализацию явно, но стеки веб-сервисов делают это неявно.

Существует множество причин, по которым десериализация XML не удалась бы на стороне клиента. По моему опыту, наиболее распространенной причиной является простое несоответствие пространства имен XML. Разница в одной косой черте в пространстве имен между клиентом и сервером означает, что XML не одинаков. Однажды я помог клиенту, который несколько дней боролся с проблемой десериализации XML, подобной этой. Оказывается, в одном пространстве имен на его сервере отсутствовала косая черта - кто-то невинно обрезал его по эстетическим соображениям.

Помимо несоответствий имен элементов XML и пространства имен, форматы даты и времени являются известным источником проблем взаимодействия в веб-службах. Это потому, что есть так много способов отформатировать время. Является ли 2006-июнь-14 таким же, как 2006/06/14? Означает ли 4/7/2007 4 июля или 7 апреля? Помимо вопросов форматирования, вы должны заботиться об относительном значении значения времени. Это UTC? Местное время? Если это местный, как вы указываете значение часового пояса?

Если у кого-то еще есть эта проблема, вот что вы можете сделать, чтобы помочь разобраться:
установить отладочный http прокси между сервисом и клиентом. Как Fiddler2 , или Charles , или Burp или proxyTrace . Таким образом, вы можете проверить XML на проводе, что поможет вам понять, почему приложение PHP не дает желаемого результата.

Часто, когда у меня возникают эти глюки взаимодействия, я настраиваю фиктивную службу, используя однородный клиент и сервер. В вашем случае это будет PHP-клиент, говорящий с PHP-сервером. Используя прокси-сервер отладки, посмотрите на трафик, генерируемый сервером PHP, который правильно принят клиентом PHP. Вам придется дублировать это в любом другом сервисе. Затем вы можете использовать прокси-сервер для проверки того, что контент, предоставляемый вашими реальными сервисами, соответствует тому, что ожидает PHP.

0 голосов
/ 08 июня 2009

Попробуйте это:

ManagementDateTimeConverter.ToDateTime((string)wmisearcherData["StartTime"]).ToString("yyyy/MM/dd HH:mm:ss")

PHP должен правильно это интерпретировать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...