Вызов веб-службы C# из PHP с длинным параметром

У нас есть клиент, который пытается вызвать нашу веб-службу, написанную на C#, из кода PHP. Вызов веб-службы требует длинного параметра.

Этот вызов отлично работает для других клиентов, звонящих с C# или Java, но этот клиент получает сообщение об ошибке в ответ на вызов. Я не отлаживал их конкретный вызов, но предполагаю, что 64-битное целое число каким-то образом урезается из PHP. Заказчик говорит, что он просто выполняет вызов веб-службы со строкой, но есть ли в PHP оболочка, которая выполняет преобразование типов. Может быть, это потеря информации о номере?

Спасибо за любую информацию.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
2 203
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Большинство установок 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.

Не зная подробностей его реализации, трудно предположить, какое может быть хорошее решение / обходной путь.

Если вам абсолютно необходимо взять такое большое число, превратите его в строку и преобразуйте в длинное в своем веб-сервисе.

Это немного побеспокоит других ваших пользователей, но сделает его более удобным для пользователей, использующих PHP.

PHP жестоко убил свою целочисленную поддержку до такой степени, что у вас нет предсказуемого способа узнать, что конкретная установка будет обрабатывать 32-битные или 64-битные целые числа.

Самый простой способ справиться с этим - открыть новую конечную точку, которая принимает строку, и просто применить ее к вам.

Для справки об эпическом провале PHP:

http://www.mysqlperformanceblog.com/2007/03/27/integers-in-php-running-with-scissors-and-portability/

Я написал статью о PHP, использующем nuSoap для вызова веб-службы C# ... Еще не сталкивался с проблемой с длинными преобразованиями int, но я определенно проведу несколько тестов, чтобы увидеть, следует ли мне добавить ее в свою статью. Спасибо, Шон http://seanmcilvenna.com/blog/7-general/24-windows-php-development

Другие вопросы по теме