本文主要簡單的介紹下在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
版權聲明:如有雷同純屬巧合,如有侵權請及時聯繫本人修改,謝謝!!!