动态WebService方法

原文:动态WebService方法

【转】

调用Webservice的方法一般是通过右击项目--》添加服务引用--》输入Webservice地址--》前往--》确定,这样可以顺利调用服,但是需要注意的一点是:如果上面的方法是在非启动项项目(比如某个类库)中添加的,在该项目下会自动生成一个app.config文件,而在主配置文件web.config中并没有自动添加上该webservice的标记,这样运行会出现错误,说找不到配置信息等等……所有还需要把app.config中的<system.serviceModel>……</system.serviceModel>这段配置添加到web.config的<configuration>……</configuration>标记中,这样运行就不会出问题了。如果以后服务地址发生了变化,也只需要修改web.config中的地址就行了。

  如果你觉得上面的方法含麻烦的话,你可以选择下面的方法:动态WebService方法。需要写一个底层解析Webservice服务地址的方法,然后调用就可以,很方便。服务地址你可以配置到web.config中,也可以保存到数据库中,随你了……

  下面通过一个判断腾讯QQ在线状态的例子说明一下动态WebService的方法。

  腾讯QQ在线状态WEB 服务:http://webservice.webxml.com.cn/webservices/qqOnlineWebService.asmx

  方法:qqCheckOnline 获得腾讯QQ在线状态

  输入参数:QQ号码 String,默认QQ号码:8698053。返回数据:String,Y = 在线;N = 离线;E = QQ号码错误;A = 商业用户验证失败;V = 免费用户超过数量

using System;
using System.Collections;
using System.Reflection;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Web.Services.Description;
using System.CodeDom;
using System.CodeDom.Compiler;
using System.Net;
using System.Web;

namespace Kayang.WebService
{
    /// <summary>
    /// WebServiceProxy 的摘要说明。
    /// </summary>
    public sealed class WebServiceProxy
    {
        private static Hashtable _assenblyCache = null;  //缓存提高效率
        public WebServiceProxy()
        {
        }
        //url:服务地址
     //methodname:方法名字
         //args:方法的参数
        public static object InvokeWebservice(string url, string nsClassName, string methodname, params object[] args)
        {
            return InvokeWebservice(url, nsClassName, methodname, 100000, args);
        }
        public static object InvokeWebservice(string url, string nsClassName, string methodname, int timeout, params object[] args)
        {
            if (args.Length == 1 && args[0] is ArrayList)
            {
                args = (args[0] as ArrayList).ToArray();
            }
            try
            {
                int li = nsClassName.LastIndexOf('.');
                string @namespace = (li == -1 ? "" : nsClassName.Substring(0, li));

                Assembly assembly;
                if (_assenblyCache == null)
                {
                    _assenblyCache = new Hashtable();
                }
                if (_assenblyCache.ContainsKey(url.ToUpper()))
                {
                    assembly = (Assembly)_assenblyCache[url.ToUpper()];
                }
                else
                {
                    System.Net.WebClient wc = new System.Net.WebClient();
                    System.IO.Stream stream = wc.OpenRead(url + "?WSDL");
                    //Configuration.SoapEnvelopeProcessingElement se = new Configuration.SoapEnvelopeProcessingElement();
                    //se.ReadTimeout = 15000;

                    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);

                    Microsoft.CSharp.CSharpCodeProvider csc = new Microsoft.CSharp.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 System.Text.StringBuilder();
                        foreach (CompilerError ce in cr.Errors)
                        {
                            sb.Append(ce.ToString());
                            sb.Append(System.Environment.NewLine);
                        }
                        throw new Exception(sb.ToString());
                    }
                    assembly = cr.CompiledAssembly;
                    _assenblyCache[url.ToUpper()] = assembly;
                }
                Type t = null;
                if (String.IsNullOrEmpty(nsClassName))
                {
                    t = assembly.GetTypes()[0];
                }
                else
                {
                    t = assembly.GetType(nsClassName, true, true);
                }
                MethodInfo mi = null;
                if (String.IsNullOrEmpty(methodname))
                {
                    mi = t.GetMethods(BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.Instance)[0];
                }
                else
                {
                    mi = t.GetMethod(methodname);
                }
                SoapHttpClientProtocol obj = Activator.CreateInstance(t) as SoapHttpClientProtocol;
                SetCookie(url, obj);
                //obj.Credentials = System.Net.CredentialCache.DefaultNetworkCredentials;
                obj.Timeout = timeout;
                return mi.Invoke(obj, args);
            }
            catch (Exception ex)
            {
                throw new Exception(ex.InnerException.Message, new Exception(ex.InnerException.StackTrace));
            }
        }

        /// <summary>
        /// 传入Cookie,使对方可以使用当前Session
        /// By 黄正 2009-12-6
        /// </summary>
        /// <param name="url"></param>
        /// <param name="obj"></param>
        private static void SetCookie(string url, SoapHttpClientProtocol obj)
        {
            HttpContext ctx = HttpContext.Current;
            if (ctx != null)
            {
                CookieContainer cc = new CookieContainer();
                foreach (string cookieName in ctx.Request.Cookies.AllKeys)
                {
                    cc.SetCookies(new Uri(url), cookieName + "=" + ctx.Request.Cookies[cookieName].Value);
                }
                //req.Headers.Add(HttpRequestHeader.Cookie, Request.Headers["Cookie"]);
                obj.CookieContainer = cc;
            }
        }
    }
}

调用:

string url = "http://webservice.webxml.com.cn/webservices/qqOnlineWebService.asmx";
string @namespace="";
string methodname = "qqCheckOnline";//需要调用的webservice中的方法
string Invoke = "123456";//QQ号码
string result = WebService.WebServiceProxy.InvokeWebservice(url, @namespace, methodname, Invoke).ToString();

 

时间: 2024-09-21 09:37:53

动态WebService方法的相关文章

动态webservice和静态webservice效率巨大差距

由于公司项目需要研究webservice由来已久,webservice的效率问题一直是个让人头疼的事情. N就前,鄙人研究了动态反射形式的动态形webservice,也大规模应用在了项目里,怎奈效率却低下到一定程度. 具体代码鄙人也贴出来,也就是网上流行的那个动态调用方法 ///<summary> ///动态Web服务代理方法 ///</summary> ///<param name="@namespace">传入空间命名</param>

C#动态webservice调用接口

  动态调用webservice,就可以不用添加web引用了,上线的话也只是需要改一下wsdl地址就可以了 C#动态webservice调用接口 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 6

android-Android代码调用mysql数据库,怎样调用,webservice方法调用怎么调用

问题描述 Android代码调用mysql数据库,怎样调用,webservice方法调用怎么调用 Android客户端调用远程动态mysql数据库,要求能向里面添加数据,并能把数据库中 的数据显示到Android代码客户端,新手,希望能给点给点demo参考一下! 解决方案 android用httpclient访问的jsp服务器端,jsp得到数据入库. 自己google android 调用web service android httpclient 以及 jsp 访问数据库 jsp 增删改查 j

gif动态图片制作方法

  gif动态图片制作方法 如果大家需要在手机上制作Gif图片那就更简单了!只需下载gif快手,即可快速制作gif动图. GIF快手是一款能够在手机上快速制作GIF动画的应用,制作好的动画还可以同步分享到微博上.GIF快手-有声音,更好玩 动态图片拍摄生成分享一气呵成,超适合拍卖萌的妹纸,搞笑的宠物,分享好友快捷方便. 电脑版: 1.首先大家需要下载必备软件,那就是photoshop,简称PS. 2.步骤一大家看图即可,字太多不打啦; 3.打开PS CS6"菜单"-"窗口&q

Henry的VB.NET之旅(十五)—动态事件处理方法

动态 Henry的VB.NET之旅(十五)-动态事件处理方法 韩睿 "大李哥,"我不免为自己问了如此多的问题而不好意思起来,"您刚才所说的事件的委托是怎么回事呀?" 大李显然是明白我会提问的:"我所说过事件驱动设计中的三要素你还记得吧?" "当然,就是指对象.事件和事件处理程序."我流利地回答道. "对象和事件处理程序我们已经分析过了.要想彻底了解事件驱动程序的来龙去脉,我们必须了解事件的构成."见到我又一

动态webservice调用接口并读取解析返回结果

  webservice的 发布一般都是使用WSDL(web service descriptive language)文件的样式来发布的,在WSDL文件里面,包含这个webservice暴露在外面可供使用的接口.今天我们来详细讨论下如何动态调用以及读取解析返回结果 这里给大家带来的是动态webservice调用接口并读取解析返回结果的具体示例,非常的简单,注释也很详细,小伙伴们可以参考下. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

动态图片gif怎么制作 迅雷影音gif动态图片制作方法图解

  gif动态图片怎么制作?kmplayer配合ps制作gif动态图片太麻烦不会弄.不用怕,迅雷影音一样可以制作gif动态图片,而且步骤简单!本文绿茶小乐哥分享迅雷影音gif动态图片制作方法图解,教大家快速制作gif动态图片. 迅雷影音gif动态图片制作功能简介: 实质是简单的视频截取,转化为gif格式,再也不怕不能用短视频制作头像了,亲测有用. 迅雷影音gif动态图片制作方法: 第一步:下载迅雷影音 点击下载安装,具体位置按个人喜好.这个都会的吧啊哈哈. 第二步:打开文件 下载完成,打开应用,

Xcode中Objc动态调用方法同时避免警告的几个办法

我们在Xcode中使用objc写代码的时候往往会碰到动态调用方法的时候. 如果是静态调用这很常见,不会有任何问题: [self performSelector:@selector(method)]; 但如果method是运行时变化的值,则编译器就会发出警告: 简单来说,这是因为编译器在开启ARC后不知道该方法的返回值是什么,该如何处理,是标记为ns_returns_retained还是ns_returns_autoreleased. 在网上搜了一下有几种办法可以解决,首先如果动态调用的方法不返回

asp.net-ASP.NET webservice方法返回求助

问题描述 ASP.NET webservice方法返回求助 省略部分xml代码 <GetUserResponse xmlns="http://tempuri.org/"> <GetUserResult> <xsd:schema>schema</xsd:schema>xml</GetUserResult> </GetUserResponse> 请问一下,这个返回代码中 xsd:schemaschema/xsd:sch