Chiamare un servizio web C # da con PHP con un parametro lungo
-
03-07-2019 - |
Domanda
Abbiamo un cliente che sta cercando di chiamare il nostro servizio web scritto in C # dal codice PHP. La chiamata al servizio Web richiede molto tempo come parametro.
Questa chiamata funziona bene per altri clienti che chiamano da C # o Java ma questo cliente sta ricevendo un errore dalla chiamata. Non ho eseguito il debug della loro chiamata specifica, ma suppongo che il numero intero a 64 bit venga troncato in qualche modo da PHP. Il cliente dice che sta solo effettuando la chiamata al servizio web con una stringa ma c'è un wrapper in PHP che digita la conversione. Questo potrebbe perdere le informazioni sul numero?
Grazie per qualsiasi informazione.
Soluzione
La maggior parte delle installazioni PHP non supporta numeri interi a 64 bit - 32 è il numero massimo. Puoi verificarlo leggendo la costante PHP_INT_SIZE (4 = 32 bit, 8 = 64 bit) o ??leggi il valore PHP_INT_MAX.
<?php
echo PHP_INT_SIZE, "\n", PHP_INT_MAX;
?>
Se la classe di servizi Web che sta usando sta cercando di convertire una rappresentazione di stringa di un numero intero a 64 bit, allora sì, probabilmente è troncata o convertita in un float. Puoi vedere questo comportamento con questo semplice test
<?php
echo intval( "12345678901234567890" );
// prints 2147483647, the max value for a 32 bit signed int.
Senza conoscere i dettagli della sua implementazione, è difficile postulare su quale potrebbe essere una buona soluzione / soluzione alternativa.
Altri suggerimenti
Se devi assolutamente prendere un numero così grande, trasformalo in una stringa e convertilo in long nel tuo servizio web.
Ciò disturberà un po 'gli altri utenti, ma lo renderebbe più amichevole con i clienti che utilizzano PHP.
PHP ha brutalmente ucciso il suo supporto per numeri interi, al punto che non hai un modo prevedibile di conoscerlo, una specifica installazione gestirà numeri interi a 32 o 64 bit.
Il modo più semplice per gestirlo sarebbe quello di esporre un nuovo endpoint che prende una stringa e lanciarlo semplicemente alla tua estremità.
Per riferimento sull'epico fallimento di PHP:
Ho scritto un articolo su PHP usando nuSoap per chiamare un servizio web C # ... Non ho ancora riscontrato il problema con conversioni int lunghe, ma sicuramente eseguirò alcuni test per vedere se dovrei aggiungerlo nel mio articolo . Grazie Sean http://seanmcilvenna.com/blog/7-general/24- finestre-php-sviluppo