Когда делал портал по недвижимости, и использовал 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;
Приложение даст сбой: