动态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) { , args); } public static object InvokeWebservice(string url, string nsClassName, string methodname, int timeout, params object[] args) { && args[] is ArrayList) { args = (args[] as ArrayList).ToArray(); } try { int li = nsClassName.LastIndexOf('.'); ? , 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()[]; } else { t = assembly.GetType(nsClassName, true, true); } MethodInfo mi = null; if (String.IsNullOrEmpty(methodname)) { mi = t.GetMethods(BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.Instance)[]; } 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中的方法 ";//QQ号码 string result = WebService.WebServiceProxy.InvokeWebservice(url, @namespace, methodname, Invoke).ToString();
动态WebService方法的更多相关文章
- C#动态webservice调用接口 (JAVA,C#)
C#动态webservice调用接口 using System; using System.Collections; using System.IO; using System.Net; using ...
- AX2012 XppCompiler create method动态创建方法并运行
在用友系列的软件中经常可以看到可配置的计算公式,AX中其实也有可配置的公式,如call center呼叫中心的欺诈Fraud rule的配置,AX后台可以根据配置规则,变量,条件来动态产生方法并执行, ...
- winform客户端程序第一次调用webservice方法很慢的解决方法
.net2.0的winform客户端最常用的与服务端通信方式是通过webservice,最近在用dottrace对客户端做性能测试的时候发现,客户端程序启动以后,第一次调用某一个webservice的 ...
- TinyMCE textarea 输入框外部程序动态修改方法
TinyMCE textarea 输入框外部程序动态修改方法 Public Function C2IE_TINYMCE(ByVal id As String, ByVal value As Strin ...
- ios的runtime为什么可以动态添加方法
一句话概括 每个instance都有一个isa,这个isa,里面含有所有的方法列表,ios提供库函数增加,修改,即实现了动态添加方法
- 使用runtime给类动态添加方法并调用 - class_addMethod
上手开发 iOS 一段时间后,我发现并不能只着眼于完成需求,利用闲暇之余多研究其他的开发技巧,才能在有限时间内提升自己水平.当然,“其他开发技巧”这个命题对于任何一个开发领域都感觉不找边际,而对于我来 ...
- Java调用.Net WebService参数为空解决办法 (远程)调试webservice方法 转
Java调用.Net WebService参数为空解决办法 (远程)调试webservice方法 同事遇到一个很囧的问题,java调,netwebservice的时候,调用无参数方法成功,调用有参 ...
- 跨域Ajax请求WebService方法
一.允许跨域Ajax请求,更改如下配置: 在要调用的WebService上面添加特性标签: 二.以如下返回用户信息的WebService方法为例 三.在另一个网站上通过Ajax访问webService ...
- 调用具体webservice方法时时报错误:请求因 HTTP 状态 503 失败: Service Temporarily Unavailable
添加web引用会在相应项目的app.cofig文件中产生如下代码: <sectionGroup name="applicationSettings" type="S ...
随机推荐
- HDU-1542 Atlantis(离散化+扫描线)
题目大意:给n个矩形,可能重叠,求面积. 题目分析:线段树维护扫描线. 代码如下: # include<bits/stdc++.h> using namespace std; # defi ...
- 归档-ios
/****普通对象归档**/ NSString *homePath=NSHomeDirectory(); NSString *fileName=@"test.vse"; NSStr ...
- 掌握 Ajax,第 2 部分: 使用 JavaScript 和 Ajax 发出异步请求
转http://www.ibm.com/developerworks/cn/xml/wa-ajaxintro2/ 掌握 Ajax,第 2 部分: 使用 JavaScript 和 Ajax 发出异步请求 ...
- Oracle数据库——SQL基本查询
一.涉及内容 1.掌握SELECT 语句的基本语法. 2.掌握常用函数的使用. 二.具体操作 (一)使用Scott方案下的emp表和dept表,完成以下操作: 1.查询部门编号是20的员工信息. 2. ...
- Android视录视频示例
这几天需要搞一个Android视频通话功能,从最简单的视频录制开始,网上例子大多不完整.下面的示例参考过别人的代码,还是拿出来给需要的朋友分享下. Activity类:VideoActivity pa ...
- 使用bind(this)的情况
1.setInterval().setTimeout()的回调函数,一定要加.bind(this)方法. 原因是:在setInterval()中定义的回调函数,是在同步代码执行完后,随着事件触发来异步 ...
- Jersey框架一:Jersey RESTful WebService框架简介
Jersey系列文章: Jersey框架一:Jersey RESTful WebService框架简介 Jersey框架二:Jersey对JSON的支持 Jersey框架三:Jersey对HTTPS的 ...
- C#动态数组ArrayList和List<T>的比较
C#中一维动态数组(即列表)分ArrayList和List<T>两种,其容量可随着我们的需要自动进行扩充 一.ArrayList类(少用) ArrayList位于System.Collec ...
- Android学习笔记1 android adb启动失败问题 adb server is out of date. killing...
下面是Android的学习笔记,原文地址. 我是使用adb devices出现如下红字错误, 使用第一种方法方法,结果关掉豌豆荚就可以了. android adb启动失败问题 adb server i ...
- js 自己创建ready多个可以依次加载
js会把相同的方法名给覆盖了,很多时候我们都无法再页面加载的时候写多个onload事件,这样只有最后一个才能起效,所以从网上找了找,最后决定自己写一个,例子很简单,希望有高人来指导指导 <!DO ...