Вызов веб-службы C# из PHP с длинным параметром
-
03-07-2019 - |
Вопрос
У нас есть клиент, который пытается вызвать наш веб-сервис, написанный на C#, из кода PHP.Вызов веб-службы принимает длинный параметр.
Этот вызов работает нормально для других клиентов, звонящих с C# или Java, но этот клиент получает ответную ошибку в результате вызова.Я не отлаживал их конкретный вызов, но предполагаю, что 64-битное целое число каким-то образом усекается из PHP.Клиент говорит, что он просто вызывает веб-сервис со строкой, но есть ли в PHP оболочка, которая выполняет преобразование типов.Может ли это быть потеря информации о номере?
Спасибо за любую информацию.
Решение
Большинство установок PHP не поддерживают 64-битные целые числа — максимум 32.Вы можете проверить это, прочитав константу PHP_INT_SIZE (4 = 32 бита, 8 = 64 бита) или прочитав значение PHP_INT_MAX.
<?php
echo PHP_INT_SIZE, "\n", PHP_INT_MAX;
?>
Если класс веб-сервиса, который он использует, пытается преобразовать строковое представление 64-битного целого числа, то да, скорее всего, оно усекается или преобразуется в число с плавающей запятой.Вы можете увидеть это поведение с помощью этого простого теста.
<?php
echo intval( "12345678901234567890" );
// prints 2147483647, the max value for a 32 bit signed int.
Не зная деталей его реализации, трудно предположить, каким может быть хорошее решение/обходной путь.
Другие советы
Если вам абсолютно необходимо взять такое большое число, сделайте его строкой и преобразуйте в long в своем веб-сервисе.
Это немного побеспокоит других ваших пользователей, но сделает его более дружелюбным для клиентов, использующих PHP.
PHP жестоко уничтожил поддержку целых чисел до такой степени, что у вас нет предсказуемого способа узнать, будет ли конкретная установка обрабатывать 32-битные или 64-битные целые числа.
Самый простой способ справиться с этим — предоставить новую конечную точку, которая принимает строку, и просто передать ее на свою сторону.
Для справки об эпическом провале PHP:
Я написал статью о PHP, использующем nuSoap для вызова веб-службы C#...Я еще не сталкивался с проблемой преобразования длинных целых чисел, но я обязательно проведу несколько тестов, чтобы понять, стоит ли добавлять ее в свою статью.Спасибо, Шонhttp://seanmcilvenna.com/blog/7-general/24-windows-php-development