WebService的创建和部署以及通过反射动态调用WebService

Posted 欢迎来到谢友海的博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

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

以上是关于WebService的创建和部署以及通过反射动态调用WebService的主要内容,如果未能解决你的问题,请参考以下文章

http请求POST和GET调用接口以及反射动态调用Webservices类

工作部署服务器

根据反射,动态调用websever

通过CXF方式实现webservice服务

webservice创建部署和调用

反射学习4-通过反射机制动态创建和访问数组