[.NET]Call Web Service With RAW SOAP

本文介紹透過 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:從零開始的軟體開發生活

請大家繼續支持 ^_^