<?php
// server.php
require_once 'lib/nusoap.php'; // NuSOAP 庫
$server = new soap_server();
$server->configureWSDL('login_service', 'https://www.example.com');
$server->wsdl->schemaTargetNamespace = 'https://www.example.com';
// 註冊方法:login_verifiy(string $name, string $pw) : string
$server->register(
'login_verifiy', // 方法名
['name' => 'xsd:string', 'pw' => 'xsd:string'], // 輸入參數
['return' => 'xsd:string'], // 輸出參數
'https://www.example.com', // namespace
false, // soapaction
'rpc', // style: rpc/document
'encoded', // use: encoded/literal
'驗證使用者登入帳密' // documentation
);
// 處理請求
$post_data = $GLOBALS['HTTP_RAW_POST_DATA'] ?? '';
$server->service($post_data);
/** 實作邏輯 */
function login_verifiy(string $name, string $pw): string {
// 實際專案應查詢資料庫、驗證密碼雜湊
if ($name === 'admin' && $pw === '123456') {
return "登入成功:歡迎 $name";
}
return "登入失敗:帳號或密碼錯誤";
}
瀏覽器開啟 https://yourhost/server.php?wsdl 即可看到自動生成的 WSDL 文件,C# 將以此為依據生成 Proxy 類別。
Visual Studio 專案右鍵 → Add Service Reference → Advanced → Add Web Reference → 輸入 WSDL 網址 → 命名空間設為 WebReference。
using System;
using System.Windows.Forms;
namespace SoapClientDemo {
public partial class Form1 : Form {
private string serviceUrl = "https://localhost/server.php";
public Form1() {
InitializeComponent();
}
private void btnLogin_Click(object sender, EventArgs e) {
try {
// 建立 Proxy(Visual Studio 自動生成的類別)
WebReference.login_service service = new WebReference.login_service();
service.Url = serviceUrl; // 可動態切換
// 呼叫遠端方法
string result = service.login_verifiy(txtUser.Text, txtPass.Text);
MessageBox.Show(result, "伺服器回應");
} catch (Exception ex) {
MessageBox.Show($"呼叫失敗:{ex.Message}", "錯誤");
}
}
}
}
app.config 自動生成:
<configuration>
<applicationSettings>
<SoapClientDemo.Properties.Settings>
<setting name="WebReference_login_service" serializeAs="String">
<value>https://localhost/server.php</value>
</setting>
</SoapClientDemo.Properties.Settings>
</applicationSettings>
</configuration>
wsdl->addComplexType(
'UserInfo',
'complexType',
'struct',
'all',
'',
[
'id' => ['name' => 'id', 'type' => 'xsd:int'],
'username' => ['name' => 'username', 'type' => 'xsd:string'],
'email' => ['name' => 'email', 'type' => 'xsd:string'],
'roles' => ['name' => 'roles', 'type' => 'xsd:string[]'],
]
);
$server->register('get_user', ['uid' => 'xsd:int'], ['return' => 'tns:UserInfo'], ...);
SoapServer 或 現代框架ini_set('soap.wsdl_cache_enabled', 1);$server->setDebug($debug_flag); 開啟除錯輸出