2017-09-28 2 views
-1

J'essaie d'utiliser le service Web entre le serveur C# et le client php.soap fault 'Chaîne d'entrée incorrecte dans le format'

Lorsque j'utilise le service web sans arguments tout fonctionne!

Mais quand je veux passer des arguments à fonctionner j'ai cette erreur: SoapFault: Le Format de la chaîne d'entrée is incorrect

Mon fichier wsdl: https://pastebin.com/ti805zkW

Mon code php:

public function previewAction(Request $req) 
{ 
    $client = new \SoapClient("http://localhost:1664/WebReport/Service/?wsdl"); 
    $preview = $client->Preview(array('id' => 1, 'choice' => 2, 'userDate' => 'test')); 
    return new JsonResponse($preview); 
} 

Mon C# Code IService:

using System.Collections.Generic; 
using System.ServiceModel; 

namespace WebReport 
{ 
    [ServiceContract] 
    public interface IService 
    { 
     [OperationContract] 
     bool Reload(); 

     [OperationContract] 
     bool Treatment(); 

     [OperationContract] 
     Dictionary<string, float> Preview(int id, int choice, string userDate); 
    } 
} 

Mon C# Code de service:

using System; 
using System.Collections.Generic; 

namespace WebReport 
{ 
    public class Service : IService 
    { 
     public bool Reload() 
     { 
      //Application.GetInstance().ReloadConfig(); 
      return true; 
     } 

     public bool Treatment() 
     { 
      //DataPoints.Treatment.GetInstance().run(); 
      return true; 
     } 

     public Dictionary<string, float> Preview(int id, int choice, string userDate) 
     { 
      Console.WriteLine("{ 0}.{ 1}.{ 2}", id, choice, userDate); 
      Dictionary<string, float> test = new Dictionary<string, float>(); 
      test.Add("2017-05-04 10:10:10", 100000); 
      test.Add("2017-05-05 10:10:10", 100001); 
      return test; 
     } 
    } 
} 

J'ai test pour extraire la classe php à partir du fichier WSDL avec wsdl2phpgenerator mais même erreur.

Des idées?

Répondre

0

Je ne suis pas un développeur PHP, mais en testant mes propres API avec PHP, j'accepte un objet dans le contrôleur, pas un argument pour chaque élément du tableau.

Créez donc une classe dont les propriétés correspondent à la matrice et prenez-la comme un argument du contrôleur.

public class PreviewDTO 
{ 
    public int id { get; set; } 
    public int choice { get; set; } 
    public string userDate { get; set; } 
} 

Et le contrôleur:

public Dictionary<string, float> Preview(PreviewDTO prev) 
{ 
    Console.WriteLine("{ 0}.{ 1}.{ 2}", prev.id, prev.choice, prev.userDate); 
    Dictionary<string, float> test = new Dictionary<string, float>(); 
    test.Add("2017-05-04 10:10:10", 100000); 
    test.Add("2017-05-05 10:10:10", 100001); 
    return test; 
} 
0

Merci pour la réponse.

J'ai trouvé mon problème.

J'ai remplacer:

Console.WriteLine("{ 0}.{ 1}.{ 2}", id, choice, userDate); 

par ceci:

Console.WriteLine("{0}.{1}.{2}", id, choice, userDate); 

Espace dans le paramètre de chaîne.