本文介紹透過 HttpWebRequest Call Web Service
一般在Call Web Service時,會透過 VS.NET 來幫我們建立Proxy物件(SoapHttpClientProtocol)。
但是有些 WebMethod 前面需要加入 Namespace 的 Prefix。
例如以下的 HelloWorld WebMethod,
<soap:Body>
<HelloWorld xmlns="http://tempuri.org/">
<name>string</name>
</HelloWorld>
</soap:Body>
有些前面有 Namespace 的 Prefix (rm),
<soap:Body>
<rm:HelloWorld xmlns:rm="http://tempuri.org/">
<name>string</name>
</rm:HelloWorld>
</soap:Body>
這時似乎沒辦法直接用 VS.NET 幫我們建立Proxy物件。
可以參考「Invoking Web Service dynamically using HttpWebRequest」的方式,自已組出整個 SOAP 的內容。
而裡面除了 body 的內容外,Header SOAPAction 的值也要參考 WSDL 的內容哦!
一般都會有值,而這次 Support 到的卻是 空字串哦! 所以要注意一下哦!
以下是測試的Code,
string soapBody =
@"<?xml version=""1.0"" encoding=""utf-8""?>
<soap:Envelope xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" xmlns:soap=""http://schemas.xmlsoap.org/soap/envelope/"">
<soap:Body>
<rm:HelloWorld xmlns:rm=""http://tempuri.org/"">
<name>Rainmaker</name>
</rm:HelloWorld>
</soap:Body>
</soap:Envelope>";
HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://localhost:60591/WebService1.asmx");
req.Headers.Add("SOAPAction", "\"http://tempuri.org/HelloWorld\"");
req.ContentType = "text/xml;charset=\"utf-8\"";
req.Accept = "text/xml";
req.Method = "POST";
using (Stream stm = req.GetRequestStream())
{
using (StreamWriter stmw = new StreamWriter(stm))
{
stmw.Write(soapBody);
}
}
WebResponse response = req.GetResponse();
using(StreamReader sr = new StreamReader(response.GetResponseStream())){
string responseBody = sr.ReadToEnd();
Console.WriteLine(responseBody);
Console.ReadKey();
}
參考資料
Invoking Web Service dynamically using HttpWebRequest
How to call WebMethod of a Web service using HttpWebRequest object
Hi,
亂馬客Blog已移到了 「亂馬客 : Re:從零開始的軟體開發生活」
請大家繼續支持 ^_^