实现WebService的调用与被调用
之前一直用WCF来开发服务,可是从未用过WebService。对WebService有种很神奇的期待,都说WebService比较简单,但是从未用过就对我来说就是一种新的知识。起始让我来说WCF与WebService好坏,其实都差不多吧,随着时代的变迁,人都向往着新的高深技术,有的时候学习一下基础的,老一点的知识也是对自己的一种提升。俗话说万变不离其宗,对我们做编程的也是如此。
最近也一直在看C#与ASp.NET的基础知识。其实对于基础知识,我们大眼一看啥都会,可是你深究起来,你就会有种你啥都不会的感觉。打实基础才能飞的更高更远,在编程的路上才能走的更远。
扯远了,现在开启正题:创建web服务
首先创建ASP.NET Web 应用程序的项目;然后在其项目下面开始创建服务如WebServiceAccept.asmx文件你会发现在App_Code下面或者直接在打开此文件再进行查看源码。就可以开始编写你所要调用的方法了
在WebService中要调用的方法,首先要在方法最上面写上[WebMethod]例如:
namespace WebServiceApplication { /// <summary> /// WebServiceApplication的摘要说明 /// </summary> [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [System.ComponentModel.ToolboxItem(false)] // 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消对下行的注释。 // [System.Web.Script.Services.ScriptService] public class WebService1 : System.Web.Services.WebService { [WebMethod] public string HelloWorld()//被调用的方法*****************************注意方法名不可以重复
{ return "Hello World"; } } }
WebService被调用可以返回不同类型的值,包括DataTable,DataSet,string ,int,double等等类型的值。
OK!Web服务这一块就先写到这里,算是比较容易吧,跟平常写个方法互相调用的关系差不多。下面开始说如何调用WebService
首先你要知道你所调用的方法在哪个页面中(URL),方法的名字(MethodName)参数object[]paras(给方法传参数是 )。
1 public class CommonWebService 2 { 3 public static object InvokeCallWebservice(string url,string methodName,object[]paras) 4 { 5 string nameSpace = "Summay";//引用空间名 6 try 7 { 8 //System.Net.WebClient 类的新实例 9 System.Net.WebClient webClient = new System.Net.WebClient(); 10 //向流中读取WebService中的地址 11 Stream stream = webClient.OpenRead(url + "?WSDL"); 12 //提供一种方法,以创建和格式化用于描述 XML Web services 的有效的 Web 服务描述语言 (WSDL) 文档文件,该文件是完整的,具有适当的命名空间、元素和属性。无法继承此类。 13 ServiceDescription sd = ServiceDescription.Read(stream);//WebService服务说明 14 string className = sd.Services[0].Name;//读取类的名字 15 ServiceDescriptionImporter sdi = new ServiceDescriptionImporter();//公开一种为 XML Web services 生成客户端代理类的方法。 16 //将指定的 System.Web.Services.Description.ServiceDescription 添加到要导入的 System.Web.Services.Description.ServiceDescriptionImporter.ServiceDescriptions 17 // 值的集合中。 18 sdi.AddServiceDescription(sd,"",""); 19 20 CodeNamespace cn = new CodeNamespace(nameSpace);//表示命名空间声明 21 CodeCompileUnit ccu = new CodeCompileUnit();//为 CodeDOM 程序图形提供容器 22 ccu.Namespaces.Add(cn);//添加空间申明 23 sdi.Import(cn,ccu);//引入控件声明 24 CSharpCodeProvider csc = new CSharpCodeProvider();//提供对 C# 代码生成器和代码编译器的实例的访问 25 CompilerParameters cplist = new CompilerParameters();//表示用于调用编译器的参数 26 cplist.GenerateExecutable = false;//获取或设置一个值,该值指示是否生成可执行文件; 如果应生成可执行文件,则为 true;否则为 false 27 cplist.GenerateInMemory = true;//获取或设置一个值,该值指示是否在内存中生成输出;如果编译器应在内存中生成输出,则为 true;否则为 false 28 cplist.ReferencedAssemblies.Add("System.dll");// 添加当前项目所引用的程序集;包含由源引用以进行编译的程序集名称 29 cplist.ReferencedAssemblies.Add("System.XML.dll"); 30 cplist.ReferencedAssemblies.Add("System.Web.Service.dll"); 31 cplist.ReferencedAssemblies.Add("System.Data.dll"); 32 //从编译器返回结果 33 CompilerResults cr = csc.CompileAssemblyFromDom(cplist,ccu); 34 if (cr.Errors.HasErrors)//判断编译器返回的结果是否包含错误 35 { 36 return null; 37 } 38 Assembly assembly = cr.CompiledAssembly;//加载(获取或者设置)已经编译的程序集 39 Type t = assembly.GetType(nameSpace+"."+className,false,true);//获取程序集具有指定的类的控件名与类的方法名,是否忽略大小写,在找不到该类型时引发的异常 40 MethodInfo mi = t.GetMethod(methodName);//搜索具有指定名称的公共方法 41 object obj = Activator.CreateInstance(t);//用指定类型的默认构造函数来创建该类型的实例 42 return mi.Invoke(obj, paras);//使用指定的参数调用当前实例所表示的方法或构造函数并返回该方法的返回值 43 } 44 catch (Exception ex) 45 { 46 return null; 47 } 48 }
执行时需要传输URL方法名称,方法参数。例如:string URL=http://localhost:3083/Readers/DMC_Service.asmx;
object obj=CommonWebService.InvokeCallWebservice(URL,"HelloWorld",new object[]{})
如果需要返回什么样的值,把object进行转换即可。
大神勿喷