-1

我们正在使用 PHP Web 服务。我们已经使用 Visual Studio 中的添加 Web 服务引用生成了 WSDL。

getOurRequest 服务方法需要一个“对象”类型的输入参数。

此方法的 PHP 文档在 PHP 中声明了以下数组。

$getOurRequest =>array( 
    `aaaa`=> ‘1111’,
    `bbbb`=> ‘2222’,
    `ccccArray`=> array(
            ‘cccc3333’
                ,‘cccc4444‘
),
    `ddddArray`=>array(
            'dddd5555'
            ,'dddd6666'
            )
);

我们如何将其转换为 C# 以用于调用 PHP Web 服务?

任何有助于解决方案或一般可序列化结构的想法都希望传递给 Web 服务,我们将不胜感激。

@quetzalcoatl 感谢您提供 var c# 声明示例。这很有帮助,但它不会通过服务调用进行序列化。

4

2 回答 2

1

直接回答您的问题,C# 中最接近的可能结构是 a Dictionary,或者更确切地说,Dictionary<string, object>

$getOurRequest => array( 
  `aaaa`=> ‘1111’,
  `bbbb`=> ‘2222’,
  `ccccArray`=> array( ‘cccc3333’, ‘cccc4444‘ ),
  `ddddArray`=>array( 'dddd5555','dddd6666' )
);

我其实不懂符号$getOurRequest => array(...);。这里不应该是普通的 = 而不是 => 吗?

无论哪种方式,在 C# 中类似的变量声明将是:

var getOurRequest = new Dictionary<string, object>
{ 
  {"aaaa", "1111"},
  {"bbbb", "2222"},
  {"ccccArray", new string[] { "cccc3333", "cccc4444" } },
  {"ddddArray", new string[] { "dddd5555", "dddd6666" } }
);

但是,我认为这不会解决您发送 HTTP 请求的问题。为此,您将需要HttpWebRequest对象,就像 Jensen 回答的那样,并且需要提供来自上面的 hashmap/array/dictionary 的所有“键”和“值”作为查询参数。

@SOAP:如果您可以为 发出 WSDL web service,那么 VisualStudio/C#/svcutil 可以生成一系列代理类,这将大大简化对 Web 服务的调用。如果你能做到,请记下,我们会给你链接到如何做到这一点..或者只是在“C#调用网络服务”上搜索谷歌..

出于好奇 - 如果您不了解 C# 并且非常了解 PHP,为什么要询问 C# 代码?

编辑:
在评论中,您谈到了“对象参数”。在 PHP 或 JS 中,对象和键控数组之间有一点区别。在 C# 中,这是一个很大的区别,因为“字典”或任何其他哈希映射最有可能被序列化为“一系列键和值” - 而不是作为具有字段/键和值的对象。如果您确实需要传递“对象”,您实际上需要有一个类和对象实例。

//[DataContract] - pick one of them
//[Serializable] - they are required, but without seeing your code, it is hard to tell which one
public class MyWebServiceParameter
{
    public string aaaa {get;set;} // those must be properties, not fields
    public string bbbb {get;set;}
    public string[] ccccArray {get;set;}
    public string[] ddddArray {get;set;}
}

....
var tmp = new MyWebServiceParameter
{
     aaaa = "1111", bbbb = "2222",
     ccccArray = new string[] { "....", "...." },
     ddddArray = new string[] { "....", "...." }
};

只需确保取消注释“属性”之一 - datacontract/serializable。它们都告诉 C# 运行时允许对此类进行序列化,但它们中的每一个都来自不同的库,或者更确切地说,来自 .Net 中的网络方法时代。一般来说,它们中的每一个都可以,但是根据从 WSDL 生成的方式/内容、.Net 以及您正在使用的额外库,其中一个会更好。如果您使用的是“最先进的”.Net,请选择 DataContract。

现在,你说你有 WSDL?因此,右键单击您的项目并选择“添加服务引用”或“添加 Web 引用”,然后在弹出对话框中输入您的 WSDL 的 URL。创建者应该能够解析它,它将为该 Web 服务生成一系列支持类。假设他们被称为“MyPHPService”,它定义了一个名为“TheServiceMethodName”的操作:

var serv = new MyPHPService();
serv.TheServiceMethodName( tmp ); // just pass the object you have created earlier. Or a dictionary, or other..

如果您的 WSDL 没有问题并且创建者理解正确,那么对于 SOAP 服务的调用只需要这两行!

于 2012-08-21T18:54:31.810 回答
0

我不知道你是如何调用你的 PHP 服务的,所以我的回答是基于个人项目的。

我对创建 SOAP 服务之类的东西没有兴趣,因为 C# 不是我与之交流的唯一语言,我想让事情保持简单。只需使用 anHttpWebRequest调用网络服务器并分析页面输出。

所以,我使用了 JSON。James Newton-King 有一个名为Json.NET的强大库。它既可以将对象转换为 JSON 也可以从 JSON 转换。

在 PHP 方面,这些函数内置在 PHP 解释器中:json_encodejson_decode

于 2012-08-21T18:44:18.170 回答