首页 > 学院 > 开发设计 > 正文

csharp: get Web.Services WebMethod

2019-11-17 02:18:06
字体:
来源:转载
供稿:网友

csharp: get Web.Services WebMethod

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
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表