一、在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:\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.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
版權聲明:如有雷同純屬巧合,如有侵權請及時聯系本人修改,謝謝!!!
