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:\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

版權聲明:如有雷同純屬巧合,如有侵權請及時聯系本人修改,謝謝!!!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM