Когда делал портал по недвижимости, и использовал NuSOAP + NET. Простой пример:
Так выглядет WSDL:
1. Итак создадим проект:
2. Напишим код на PHP index.php:
<?php
require_once('./lib/nusoap.php');
$str_URL = "http://localhost/nusoap/index.php";
$str_namespace = $str_URL . '?wsdl';
$obj_server = new soap_server();
$obj_server->soap_defencoding = 'utf-8';
$obj_server->decode_utf8 = false;
$obj_server->encode_utf8 = true;
$obj_server->configureWSDL('books', $str_namespace);
$obj_server->register('get_data', array(),
array('return'=>'xsd:string'));
function get_data() {
$arr_data = array(
array('id'=>'1', 'isbn'=>'aaa', 'author'=>'bbb', 'year'=>'2020'),
array('id'=>'2', 'isbn'=>'bbb', 'author'=>'ccc', 'year'=>'2020')
);
$obj_xml = new DOMDocument('1.0', 'utf-8');
$obj_xml_item = $obj_xml->createElement('items');
foreach($arr_data as $arr_d) {
$obj_xml_subitem = $obj_xml->createElement('item');
foreach($arr_d as $k => $v)
$obj_xml_subitem->setAttribute($k, $v);
$obj_xml_item->appendChild($obj_xml_subitem);
}
$obj_xml->appendChild($obj_xml_item);
return $obj_xml->saveXML();
}
$POST_DATA = isset($GLOBALS['HTTP_RAW_POST_DATA'])
? $GLOBALS['HTTP_RAW_POST_DATA'] : '';
$obj_server->service($POST_DATA);
?>
3. Запустим XAMPP, и добавим службу в наш проект:
4. Введём URI путь к веб службе:
Вот наш метод get_data:

5. Напишим код на C# Form1.cs:
using System;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void bnCallWSDL_Click(object sender, EventArgs e)
{
try
{
ServiceReference1.booksPortTypeClient bc = new ServiceReference1.booksPortTypeClient(); // NuSOAP
String data = bc.get_data(); // Возвращает XML
MessageBox.Show(data); // Показываем Alert
DataSet ds = new DataSet();
DataTable dt = new DataTable("tb1");
dt.Columns.Add("id");
dt.Columns.Add("isbn");
dt.Columns.Add("author");
dt.Columns.Add("year");
ds.Tables.Add(dt);
StringReader sr = new StringReader(data);
ds.ReadXml(sr, XmlReadMode.ReadSchema);
this.dataGridView1.DataSource = ds.Tables[0];
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
private void Form1_Load(object sender, EventArgs e)
{
}
}
}
Вуаля! Результат работы:
P.S. Замечу, если не написать такой код, в PHP:
$obj_server->soap_defencoding = 'utf-8'; $obj_server->decode_utf8 = false; $obj_server->encode_utf8 = true;
Приложение даст сбой: