[C#] 取得.net WebService(.asmx) 的自訂複雜型別

2013-06-10

最近在處理一些.net Web Service 的東西,如果寫出一個WebService 如下.

2013-06-10_191025

其中我有宣告兩個自訂的物件 User 還有 ContactBook 其中的 ContactBook裡面又有User[]

2013-06-10_191151

假設如果是遠端的Web Service ,我要如何取的這些內容呢?!

其實透過 SOAP 協定中,可以透過 WSDL 其中含有其物件的XML描述結構.

在.net Service 下面只需要後面加上?wsdl 就可看到結構..

舉例: http://www.webservicex.net/weatherforecast.asmx?wsdl

這是一個線上公開的Web Service 專門取得天氣..

透過此方式可以看到定義的自訂型別..

2013-06-10_191435

這時候理論上我們只需要透過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 :

2013-06-10_192024

2013-06-10_192059

測試網路上的Web Service : http://www.webservicex.net/weatherforecast.asmx

2013-06-10_192145

Source Code :


當麻許的超技八 2014 | Donma Hsu Design.