using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.Services.Description;using System.Web.Services.PRotocols;using System.Web.Services.Discovery;using System.Web.Services;using System.Net;using System.IO;using System.CodeDom;using System.CodeDom.Compiler;using Microsoft.CSharp;using System.Reflection;using System.Text;namespace WebServerProjectDemo{ /// <summary> /// /// </summary> public class WebServiceHelper { #region InvokeWebService /// <summary> /// /// </summary> /// <param name="url"></param> /// <param name="methodname"></param> /// <param name="args"></param> /// <returns></returns> public static object InvokeWebService(string url, string methodname, object[] args) { return WebServiceHelper.InvokeWebService(url, null, methodname, args); } /// <summary> /// 动态调用WebService /// </summary> /// <param name="url">WebService地址</param> /// <param name="classname">类名</param> /// <param name="methodname">方法名(模块名)</param> /// <param name="args">参数列表</param> /// <returns>object</returns> public static object InvokeWebService(string url, string classname, string methodname, object[] args) { string @namespace = "ServiceBase.WebService.DynamicWebLoad"; if (classname == null || classname == "") { classname = WebServiceHelper.GetClassName(url); } //获取服务描述语言(WSDL) WebClient wc = new WebClient(); Stream stream = wc.OpenRead(url + "?WSDL"); ServiceDescription sd = ServiceDescription.Read(stream); ServiceDescriptionImporter sdi = new ServiceDescriptionImporter(); sdi.AddServiceDescription(sd, "", ""); CodeNamespace cn = new CodeNamespace(@namespace); //生成客户端代理类代码 CodeCompileUnit ccu = new CodeCompileUnit(); ccu.Namespaces.Add(cn); sdi.Import(cn, ccu); CSharpCodeProvider csc = new CSharpCodeProvider(); ICodeCompiler icc = csc.CreateCompiler(); //设定编译器的参数 CompilerParameters cplist = new CompilerParameters(); cplist.GenerateExecutable = false; cplist.GenerateInMemory = true; cplist.ReferencedAssemblies.Add("System.dll"); cplist.ReferencedAssemblies.Add("System.xml.dll"); cplist.ReferencedAssemblies.Add("System.Web.Services.dll"); cplist.ReferencedAssemblies.Add("System.Data.dll"); //编译代理类 CompilerResults cr = icc.CompileAssemblyFromDom(cplist, ccu); if (true == cr.Errors.HasErrors) { System.Text.StringBuilder sb = new StringBuilder(); foreach (CompilerError ce in cr.Errors) { sb.Append(ce.ToString()); sb.Append(System.Environment.NewLine); } throw new Exception(sb.ToString()); } //生成代理实例,并调用方法 System.Reflection.Assembly assembly = cr.CompiledAssembly; Type t = assembly.GetType(@namespace + "." + classname, true, true); object obj = Activator.CreateInstance(t); System.Reflection.MethodInfo mi = t.GetMethod(methodname); return mi.Invoke(obj, args); } /// <summary> /// /// </summary> /// <param name="url"></param> /// <returns></returns> private static string GetClassName(string url) { string[] parts = url.Split('/'); string[] pps = parts[parts.Length - 1].Split('.'); return pps[0]; } #endregion }}
测试1
string url = "http://www.webservicex.net/globalweather.asmx"; string[] args = new string[2]; args[0] = "shenzhen"; args[1] = "China"; object result = WebServiceHelper.InvokeWebService(url, "GetWeather", args); this.label_Result.Text = result.ToString();
原结果:
<string xmlns="http://www.webserviceX.NET"><?xml version="1.0" encoding="utf-16"?> <CurrentWeather> <Location>Shenzhen, China (ZGSZ) 22-33N 114-06E 18M</Location> <Time>Jun 25, 2015 - 10:00 AM EDT / 2015.06.25 1400 UTC</Time> <Wind> from the SSE (150 degrees) at 13 MPH (12 KT):0</Wind> <Visibility> greater than 7 mile(s):0</Visibility> <SkyConditions> mostly clear</SkyConditions> <Temperature> 84 F (29 C)</Temperature> <DewPoint> 78 F (26 C)</DewPoint> <RelativeHumidity> 83%</RelativeHumidity> <Pressure> 29.68 in. Hg (1005 hPa)</Pressure> <Status>Success</Status> </CurrentWeather></string>
测试2
try { /* * http://webservice.webxml.com.cn/webservices/DomesticAirline.asmx getDomesticAirlinesTime 获得航班时刻表 DataSet 输入参数:startCity = 出发城市(中文城市名称或缩写、空则默认:上海);lastCity = 抵达城市(中文城市名称或缩写、空则默认:北京);theDate = 出发日期(String 格式:yyyy-MM-dd,如:2007-07-02,空则默认当天);userID = 商业用户ID(免费用户不需要) 返回数据:DataSet,Table(0)结构为 Item(Company)航空公司、Item(AirlineCode)航班号、Item(StartDrome)出发机场、Item(ArriveDrome)到达机场、Item(StartTime)出发时间、Item(ArriveTime)到达时间、Item(Mode)机型、Item(AirlineStop)经停、Item(Week)飞行周期(星期) */ string url = "http://webservice.webxml.com.cn/webservices/DomesticAirline.asmx"; string[] args = new string[4]; args[0] = "上海"; args[1] = "北京"; args[2] = "2015-6-25";//当天时间 args[3] = ""; object result = WebServiceHelper.InvokeWebService(url, "getDomesticAirlinesTime", args); DataSet dsetAirline = result as DataSet; this.GridView1.DataSource = dsetAirline.Tables[0]; this.GridView1.DataBind(); Response.Write(dsetAirline.Tables[0].Rows.Count.ToString()); } catch (Exception ex) { Response.Write(ex.Message.ToString()); }
查询原结果:
<DataSet xmlns="http://WebXml.com.cn/"><xs:schema xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="Airlines"><xs:element name="Airlines" msdata:IsDataSet="true" msdata:UseCurrentLocale="true"><xs:complexType><xs:choice minOccurs="0" maxOccurs="unbounded"><xs:element name="AirlinesTime"><xs:complexType><xs:sequence><xs:element name="Company" type="xs:string" minOccurs="0"/><xs:element name="AirlineCode" type="xs:string" minOccurs="0"/><xs:element name="StartDrome" type="xs:string" minOccurs="0"/><xs:element name="ArriveDrome" type="xs:string" minOccurs="0"/><xs:element name="StartTime" type="xs:string" minOccurs="0"/><xs:element name="ArriveTime" type="xs:string" minOccurs="0"/><xs:element name="Mode" type="xs:string" minOccurs="0"/><xs:element name="AirlineStop" type="xs:string" minOccurs="0"/><xs:element name="Week" type="xs:string" minOccurs="0"/></xs:sequence></xs:complexType></xs:element></xs:choice></xs:complexType></xs:element></xs:schema><diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1"><Airlines xmlns=""><AirlinesTime diffgr:id="AirlinesTime1" msdata:roWorder="0"><Company>东方航空</Company><AirlineCode>M
新闻热点
疑难解答