-
ASP.NET中WebService的创建和部署以及通过反射动态调用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.WebServiceDemo { /// <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:WindowsSystem32driversetc
以记事本方式打开,配置方式如下,格式: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.WebServiceDemo { 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.WebServiceDemo/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.WebServiceDemo { 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.WebServiceDemo/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/1dFYNVYNw3a_4TKwwSToadA
提取码:feg8
参考博文:https://www.cnblogs.com/atree/p/WebService_dynamic.html
原文:https://www.cnblogs.com/xyh9039/p/11295528.html
版权声明:如有雷同纯属巧合,如有侵权请及时联系本人修改,谢谢!!!