• 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

    版权声明:如有雷同纯属巧合,如有侵权请及时联系本人修改,谢谢!!!

  • 相关阅读:
    python的is和==
    pycharm设置
    springboot 配置中心 nacos 简易部署+ 手把手教 涂涂
    解决: springboot 有了eurake怎么再添加 nacos? 【springboot配置多注册中心,同时生效~,不是切换】 涂涂
    .NET Core/.NET5/.NET6 开源项目汇总5:(权限)管理系统项目
    解决ueditor报错:ZeroClipboard undefined
    如何评价 Qt 的发展前景?
    WPF HandyControl开源UI库学习笔记
    C#中的深度学习(一):使用OpenCV识别硬币
    使用SVN进行文档管理和部门知识库建设的建议
  • 原文地址:https://www.cnblogs.com/xyh9039/p/11295528.html
Copyright © 2020-2023  润新知