WebService的创建和部署以及通过反射动态调用WebService
程序员文章站
2023-11-09 21:59:58
本文主要简单的介绍下在ASP.NET中WebService是如何创建的,怎样部署到我们的IIS上面,以及如何通过反射来动态调用WebService的。 ......
一、在asp.net中创建webservice
首先我们先创建一个asp.net web应用程序,此处我们以vs2017为例
点击新创建的项目,右键添加新建项,选择web服务,输入名称点击添加
这样我们基础的webservice就创建好了
接下来我们填加一个webservice的测试方法,并且打上特性标签webmethod
只有打上特性标签webmethod并且访问修饰符设置为public后外部才能调用到该方法
using system; using system.collections.generic; using system.linq; using system.web; using system.web.services; namespace tianya.dotnetshare.webappdemo { /// <summary> /// webservicetest 的摘要说明 /// </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 webservicetest : system.web.services.webservice { [webmethod] public string helloworld() { return "hello world"; } /// <summary> /// webservice测试方法 /// </summary> /// <param name="paramin">入参</param> /// <param name="paramout">出参</param> /// <returns>返回值</returns> [webmethod(description = "webservice测试方法")] public string sayhello(string paramin, ref string paramout) { paramout = string.format("hello {0}!", paramin); return "success"; } } }
到此我们的webservice就创建完毕了,很简单吧!
二、将创建的webservice部署到我们的iis上面
其实webservice部署和我们的网站部署是一样的,下面就简单的介绍下
首先我们需要先配置域名解析,修改hosts文件
hosts文件路径:c:\windows\system32\drivers\etc
以记事本方式打开,配置方式如下,格式:127.0.0.1 一个空格 自定义的域名 ,配置完成后记得保存
接下来我们添加一个公用的应用程序池,点击“应用程序池”右键“添加应用程序池”
选择完后点击确定,然后点击生成的应用程序池右键选择高级设置,将标识改成localsystem,点击确定
设置完成后效果如下
最后就是添加网站了,点击“网站”右键选择“添加网站”
物理路径就是指我们的项目路径,弄完后点击确定
到此我们的webservice就全部部署好了,下面测试一下是否成功
浏览器访问正常,说明我们webservice部署成功啦!
三、通过反射动态调用webservice
此处为了演示,首先我们添加一个webservice的帮助类webservicehelper.cs
具体代码如下:
using system; using system.net; using system.io; using system.codedom; using system.codedom.compiler; using system.web.services.description; //需导入system.web.services程序集(添加引用) using microsoft.csharp; namespace tianya.dotnetshare.webappdemo { public static class webservicehelper { #region 通过反射动态调用webservice #region 调用示例 /************************************************************************************ * * webservice方法: * [webmethod(description = "webservice测试方法")] * public string sayhello(string paramin,ref string paramout) * { * paramout = string.format("hello {0}!", paramin); * return "success"; * } * * 调用示例如下: * object[] objs = new object[] { "张三", "" }; //入参 * var webserviceurl = "http://tianya.dotnetshare.webappdemo/webservicetest.asmx"; * object result = webservicehelper.invokewebservice(webserviceurl, "sayhello", objs); //返回结果 * object paramout = objs[1]; //出参 * ************************************************************************************/ #endregion /// <summary> /// 通过反射动态调用webservice /// </summary> /// <param name="webserviceurl">webservices地址</param> /// <param name="methodname">调用的方法名</param> /// <param name="args">把调用webservice时需要的参数按顺序放到这个object[]里,如果无参数传null</param> /// <returns>返回调用webservice的返回值,如果调用出错则返回null</returns> public static object invokewebservice(string webserviceurl, string methodname, params object[] args) { //这里的namespace是需要引用的webservice的命名空间,不用改也可以正常使用。也可以加一个参数从外面传进来。 string @namespace = "client"; try { //判断webserviceurl中末尾是否包含“?wsdl”,如果不包含则添加 if (webserviceurl != null && !webserviceurl.equals("")) { if (webserviceurl.lastindexof("?") > -1) { if (webserviceurl.toupper().lastindexof("wsdl") <= -1) { webserviceurl = webserviceurl + "wsdl"; } } else { webserviceurl = webserviceurl + "?wsdl"; } } //获取wsdl webclient wc = new webclient(); stream stream = wc.openread(webserviceurl); servicedescription sd = servicedescription.read(stream); string classname = sd.services[0].name; 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 = csc.compileassemblyfromdom(cplist, ccu); if (true == cr.errors.haserrors) { system.text.stringbuilder sb = new system.text.stringbuilder(); foreach (system.codedom.compiler.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); //注:method.invoke(obj, null)返回的是一个object, //如果你服务端返回的是dataset,这里也是用(dataset)method.invoke(obj, null)转一下就行了, //method.invoke(obj,null)这里的null可以传调用方法需要的参数,string[]形式的 return mi.invoke(obj, args); } catch (exception ex) { //异常日志处理 return null; } } #endregion } }
在index页面调用
using system; using system.collections.generic; using system.linq; using system.web; using system.web.ui; using system.web.ui.webcontrols; namespace tianya.dotnetshare.webappdemo { public partial class index : system.web.ui.page { protected void page_load(object sender, eventargs e) { //调用示例如下: object[] objs = new object[] { "张三", "" }; //入参 var webserviceurl = "http://tianya.dotnetshare.webappdemo/webservicetest.asmx"; object result = webservicehelper.invokewebservice(webserviceurl, "sayhello", objs); //返回结果 object paramout = objs[1]; //出参 response.write($"调用结果result:{result}<br/>出参结果paramout:{paramout}"); } } }
页面输出结果:
至此就全部介绍完了,如果你觉得这篇文章对你有所帮助请记得点赞哦,谢谢!!!
webservice的demo源码:
链接:https://pan.baidu.com/s/19ujbz2a0dcxsgs1snfyltg 提取码:kwop
参考文章:https://www.cnblogs.com/atree/p/webservice_dynamic.html
版权声明:如有雷同纯属巧合,如有侵权请及时联系本人修改,谢谢!!!