using BP.Sys; using BP.WF.HttpHandler; using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Text; using System.Web.Services.Description; using System.Xml.Schema; namespace BP.WF.Difference { public class WF_Admin_FoolFormDesigner { /// /// 获取webservice方法列表 /// /// WebService数据源 /// public static List GetWebServiceMethods(SFDBSrc dbsrc) { if (dbsrc == null || string.IsNullOrWhiteSpace(dbsrc.IP)) return new List(); var wsurl = dbsrc.IP.ToLower(); if (!wsurl.EndsWith(".asmx") && !wsurl.EndsWith(".svc")) throw new Exception("@失败:" + dbsrc.No + " 中WebService地址不正确。"); wsurl += wsurl.EndsWith(".asmx") ? "?wsdl" : "?singleWsdl"; #region //解析WebService所有方法列表 //var methods = new Dictionary(); //名称Name,全称Text List mtds = new List(); WSMethod mtd = null; var wc = new WebClient(); var stream = wc.OpenRead(wsurl); var sd = ServiceDescription.Read(stream); var eles = sd.Types.Schemas[0].Elements.Values.Cast(); var s = new StringBuilder(); XmlSchemaComplexType ctype = null; XmlSchemaSequence seq = null; XmlSchemaElement res = null; foreach (var ele in eles) { if (ele == null) continue; var resType = string.Empty; var mparams = string.Empty; //获取接口返回元素 res = eles.FirstOrDefault(o => o.Name == (ele.Name + "Response")); if (res != null) { mtd = new WSMethod(); //1.接口名称 ele.Name mtd.No = ele.Name; mtd.ParaMS = new Dictionary(); //2.接口返回值类型 ctype = res.SchemaType as XmlSchemaComplexType; seq = ctype.Particle as XmlSchemaSequence; if (seq != null && seq.Items.Count > 0) mtd.Return = resType = (seq.Items[0] as XmlSchemaElement).SchemaTypeName.Name; else continue;// resType = "void"; //去除不返回结果的接口 //3.接口参数 ctype = ele.SchemaType as XmlSchemaComplexType; seq = ctype.Particle as XmlSchemaSequence; if (seq != null && seq.Items.Count > 0) { foreach (XmlSchemaElement pe in seq.Items) { mparams += pe.SchemaTypeName.Name + " " + pe.Name + ", "; mtd.ParaMS.Add(pe.Name, pe.SchemaTypeName.Name); } mparams = mparams.TrimEnd(", ".ToCharArray()); } mtd.Name = string.Format("{0} {1}({2})", resType, ele.Name, mparams); mtds.Add(mtd); //methods.Add(ele.Name, string.Format("{0} {1}({2})", resType, ele.Name, mparams)); } } stream.Close(); stream.Dispose(); wc.Dispose(); #endregion return mtds; } } }