欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-07-11 17:54:52
本文主要简单的介绍下在ASP.NET中WebService是如何创建的,怎样部署到我们的IIS上面,以及如何通过反射来动态调用WebService的。 ......

一、在asp.net中创建webservice

首先我们先创建一个asp.net web应用程序,此处我们以vs2017为例

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

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

点击新创建的项目,右键添加新建项,选择web服务,输入名称点击添加

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

这样我们基础的webservice就创建好了

WebService的创建和部署以及通过反射动态调用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

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

以记事本方式打开,配置方式如下,格式:127.0.0.1 一个空格 自定义的域名 ,配置完成后记得保存

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

接下来我们添加一个公用的应用程序池,点击“应用程序池”右键“添加应用程序池”

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

选择完后点击确定,然后点击生成的应用程序池右键选择高级设置,将标识改成localsystem,点击确定

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

设置完成后效果如下

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

最后就是添加网站了,点击“网站”右键选择“添加网站”

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

物理路径就是指我们的项目路径,弄完后点击确定

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

到此我们的webservice就全部部署好了,下面测试一下是否成功

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

浏览器访问正常,说明我们webservice部署成功啦!

三、通过反射动态调用webservice

此处为了演示,首先我们添加一个webservice的帮助类webservicehelper.cs

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

具体代码如下:

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的创建和部署以及通过反射动态调用WebService

至此就全部介绍完了,如果你觉得这篇文章对你有所帮助请记得点赞哦,谢谢!!!

 webservice的demo源码:

链接:https://pan.baidu.com/s/19ujbz2a0dcxsgs1snfyltg 
提取码:kwop

 

参考文章:https://www.cnblogs.com/atree/p/webservice_dynamic.html

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