soap fault'输入字符串不是正确的格式'

时间:2017-09-28 20:48:10

标签: c# php web-services soap wsdl

我尝试在c#server和php client之间使用web服务。

当我使用没有参数的Web服务时,一切正常!

但是当我想将参数传递给函数时我有这个错误: SoapFault:Le format delachaîned'entréeest错误

我的wsdl文件: https://pastebin.com/ti805zkW

我的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);
}

我的c#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);
    }
}

我的c#服务代码:

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;
        }
    }
}

我测试用wsdl2phpgenerator从wsdl文件中提取php类但是同样的错误。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

我不是PHP开发人员,但在使用PHP测试我自己的API时,我接受控制器中的对象,而不是每个数组项的参数。

因此,创建一个具有与数组匹配的属性的类,并将其作为控制器的一个参数。

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

控制器:

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;
}

答案 1 :(得分:0)

感谢您的回答。

我发现了我的问题。

我已经取代了这个:

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

由此:

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

字符串参数中的空格。