[C#] 取得.net WebService(.asmx) 的自訂複雜型別
最近在處理一些.net Web Service 的東西,如果寫出一個WebService 如下.
其中我有宣告兩個自訂的物件 User 還有 ContactBook 其中的 ContactBook裡面又有User[]
假設如果是遠端的Web Service ,我要如何取的這些內容呢?!
其實透過 SOAP 協定中,可以透過 WSDL 其中含有其物件的XML描述結構.
在.net Service 下面只需要後面加上?wsdl 就可看到結構..
舉例: http://www.webservicex.net/weatherforecast.asmx?wsdl
這是一個線上公開的Web Service 專門取得天氣..
透過此方式可以看到定義的自訂型別..
這時候理論上我們只需要透過XML Parser 去Parse 去取得就好了..
但是查一下文就後發現..其實.net 很溫馨,只需要使用 System.Web.Services.Description
就可以得到很多資源 ..下面程式碼就是取得 .net WebService(.asmx) 中複雜的型別..
/// <summary>
/// 透過網址取得資料後 並且讀為 ServiceDescription
/// </summary>
/// <param name="servicePath"></param>
/// <returns></returns>
private ServiceDescription GeServiceDescriptionFromServicePath(string servicePath)
{
if (!servicePath.ToLower().Contains("?wsdl"))
{
servicePath = servicePath + "?wsdl";
}
var wc = new WebClient();
wc.Encoding = UTF8Encoding.UTF8;
byte[] byteArray = Encoding.UTF8.GetBytes(wc.DownloadString(servicePath));
var stream = new MemoryStream(byteArray);
return ServiceDescription.Read(stream);
}
protected void btnGetTypes_Click(object sender, EventArgs e)
{
var serviceDesc = GeServiceDescriptionFromServicePath(txtWebServicePath.Text);
ltlResult.Text = "";
foreach (var modelType in serviceDesc.Types.Schemas[0].Items)
{
var elems = modelType as XmlSchemaComplexType;
if (elems != null)
{
ltlResult.Text += "<span style='color:red'>" + elems.Name + ":" + "</span><br />";
var sequence = elems.Particle as XmlSchemaSequence;
if (sequence != null)
{
foreach (XmlSchemaElement childElement in sequence.Items)
{
ltlResult.Text += childElement.Name + "," + childElement.SchemaTypeName.Name + "<br />";
}
}
ltlResult.Text += "---<br />";
}
}
}
結果:
範例自訂的 Web Service :
測試網路上的Web Service : http://www.webservicex.net/weatherforecast.asmx
Source Code :
標籤:
.Net
,
C#
,
WebService
-- Yesterday I wrote down the code. I bet I could be your hero. I am a mighty little programmer. 如果這篇文章有幫助到您,簡單留個言,或是幫我按個讚,讓我有寫下去的動力...