GVKun编程网logo

WebServiceProxy---反射调用方法(javaweb反射机制)

26

本文将介绍WebServiceProxy---反射调用方法的详细情况,特别是关于javaweb反射机制的相关信息。我们将通过案例分析、数据研究等多种方式,帮助您更全面地了解这个主题,同时也将涉及一些关

本文将介绍WebServiceProxy---反射调用方法的详细情况,特别是关于javaweb反射机制的相关信息。我们将通过案例分析、数据研究等多种方式,帮助您更全面地了解这个主题,同时也将涉及一些关于.NET WebService 动态调用方法~、AJAX ScriptManagerProxy调用webservice、Android 4.0 怎么调用Webservice 还有就是怎么调用带SoapHeader的Webservice、ASP.NET中WebService的创建和部署以及通过反射动态调用WebService的知识。

本文目录一览:

WebServiceProxy---反射调用方法(javaweb反射机制)

WebServiceProxy---反射调用方法(javaweb反射机制)

/// <summary> 
    /// WebServiceProxy 的摘要说明 
    /// </summary> 
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [ToolboxItem(false)]
    // 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消对下行的注释。 
    // [System.Web.Script.Services.ScriptService] 
    public class WebServiceCaller : System.Web.Services.WebService
    {

        #region 私有变量和属性定义 
        /// <summary>          
        /// web服务地址              
        /// </summary>               
        private string _wsdlUrl = string.Empty;
        /// <summary>          
        /// web服务名称              
        /// </summary>               
        private string _wsdlName = string.Empty;
        /// <summary>          
        /// 代理类命名空间              
        /// </summary>               
        private string _wsdlNamespace = "FrameWork.WebService.DynamicWebServiceCalling.{0}";
        /// <summary>          
        /// 代理类类型名称              
        /// </summary>               
        private Type _typeName = null;
        /// <summary>          
        /// 程序集名称               
        /// </summary>               
        private string _assName = string.Empty;
        /// <summary>          
        /// 代理类所在程序集路径              
        /// </summary>               
        private string _assPath = string.Empty;
        /// <summary>          
        /// 代理类的实例              
        /// </summary>               
        private object _instance = null;
        /// <summary>          
        /// 代理类的实例              
        /// </summary>               
        private object Instance
        {
            get
            {
                if (_instance == null)
                {
                    _instance = Activator.CreateInstance(_typeName);
                    return _instance;
                }
                else
                    return _instance;
            }
        }
        #endregion

        #region 构造函数 
        public WebServiceCaller(string wsdlUrl)
        {

            this._wsdlUrl = wsdlUrl;
            string wsdlName = WebServiceCaller.getWsclassName(wsdlUrl);
            this._wsdlName = wsdlName;
            this._assName = string.Format(_wsdlNamespace, wsdlName);
            this._assPath = Path.GetTempPath() + this._assName + getMd5Sum(this._wsdlUrl) + ".dll";
            this.CreateServiceAssembly();
        }

        public WebServiceCaller(string wsdlUrl, string wsdlName)
        {
            this._wsdlUrl = wsdlUrl;
            this._wsdlName = wsdlName;
            this._assName = string.Format(_wsdlNamespace, wsdlName);
            this._assPath = Path.GetTempPath() + this._assName + getMd5Sum(this._wsdlUrl) + ".dll";
            this.CreateServiceAssembly();
        }
        #endregion

        #region 得到WSDL信息,生成本地代理类并编译为DLL,构造函数调用,类生成时加载 
        /// <summary>              
        /// 得到WSDL信息,生成本地代理类并编译为DLL              
        /// </summary>               
        private void CreateServiceAssembly()
        {
            if (this.checkCache())
            {
                this.initTypeName();
                return;
            }
            if (string.IsNullOrEmpty(this._wsdlUrl))
            {
                return;
            }
            try
            {
                //使用WebClient下载WSDL信息             
                WebClient web = new WebClient();
                Stream stream = web.OpenRead(this._wsdlUrl);
                ServiceDescription description = ServiceDescription.Read(stream);//创建和格式化WSDL文档 
                ServiceDescriptionImporter importer = new ServiceDescriptionImporter();//创建客户端代理代理类 
                importer.ProtocolName = "Soap";
                importer.Style = ServiceDescriptionImportStyle.Client; //生成客户端代理             
                importer.CodeGenerationOptions = CodeGenerationOptions.GenerateProperties | CodeGenerationOptions.GenerateNewAsync;
                importer.AddServiceDescription(description, null, null);//添加WSDL文档 
                                                                        //使用CodeDom编译客户端代理类          
                CodeNamespace nmspace = new CodeNamespace(_assName);  //为代理类添加命名空间         
                CodeCompileUnit unit = new CodeCompileUnit();
                unit.Namespaces.Add(nmspace);
                this.checkForImports(this._wsdlUrl, importer);
                ServiceDescriptionImportWarnings warning = importer.Import(nmspace, unit);
                CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp");
                CompilerParameters parameter = new CompilerParameters();
                parameter.ReferencedAssemblies.Add("System.dll");
                parameter.ReferencedAssemblies.Add("System.XML.dll");
                parameter.ReferencedAssemblies.Add("System.Web.Services.dll");
                parameter.ReferencedAssemblies.Add("System.Data.dll");
                parameter.GenerateExecutable = false;
                parameter.GenerateInMemory = false;
                parameter.IncludeDebugInformation = false;
                CompilerResults result = provider.CompileAssemblyFromDom(parameter, unit);
                provider.Dispose();
                if (result.Errors.HasErrors)
                {
                    string errors = string.Format(@"编译错误:{0}错误!", result.Errors.Count);
                    foreach (CompilerError error in result.Errors)
                    {
                        errors += error.ErrorText;
                    }
                    throw new Exception(errors);
                }
                this.copyTempAssembly(result.PathToAssembly);
                this.initTypeName();
            }
            catch (Exception e)
            {
                throw new Exception(e.Message);
            }
        }
        #endregion

        #region 执行Web服务方法 
        /// <summary>              
        /// 执行代理类指定方法,有返回值                
        /// </summary>                 
        /// <param  name="methodName">方法名称</param>              
        /// <param  name="param">参数</param>               
        /// <returns>object</returns>                 
        public object ExecuteQuery(string methodName, object[] param)
        {
            object rtnObj = null;
            try
            {
                if (this._typeName == null)
                {
                    //记录Web服务访问类名错误日志代码位置 
                    throw new TypeLoadException("Web服务访问类名【" + this._wsdlName + "】不正确,请检查!");
                }
                //调用方法 
                MethodInfo mi = this._typeName.GetMethod(methodName);
                //MethodInfo mi = this._typeName.GetMethod(methodName,BindingFlags.Public);
                //MethodInfo[] mis = this._typeName.GetMethods();
                if (mi == null)
                {
                    //记录Web服务方法名错误日志代码位置 
                    throw new TypeLoadException("Web服务访问方法名【" + methodName + "】不正确,请检查!");
                }
                try
                {
                    if (param == null)
                        rtnObj = mi.Invoke(Instance, null);
                    else
                    {
                        rtnObj = mi.Invoke(Instance, param);
                        //rtnObj = mi.Invoke(Instance, new object[] { param }); 
                    }
                }
                catch (TypeLoadException tle)
                {
                    //记录Web服务方法参数个数错误日志代码位置 
                    throw new TypeLoadException("Web服务访问方法【" + methodName + "】参数个数不正确,请检查!", new TypeLoadException(tle.StackTrace));
                }
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message, new Exception(ex.StackTrace));
            }
            return rtnObj;
        }

        /// <summary>              
        /// 执行代理类指定方法,无返回值                
        /// </summary>                 
        /// <param  name="methodName">方法名称</param>              
        /// <param  name="param">参数</param>               
        public void ExecuteNoQuery(string methodName, object[] param)
        {
            try
            {
                if (this._typeName == null)
                {
                    //记录Web服务访问类名错误日志代码位置 
                    throw new TypeLoadException("Web服务访问类名【" + this._wsdlName + "】不正确,请检查!");
                }
                //调用方法 
                MethodInfo mi = this._typeName.GetMethod(methodName);
                if (mi == null)
                {
                    //记录Web服务方法名错误日志代码位置 
                    throw new TypeLoadException("Web服务访问方法名【" + methodName + "】不正确,请检查!");
                }
                try
                {
                    if (param == null)
                        mi.Invoke(Instance, null);
                    else
                        mi.Invoke(Instance, param);
                }
                catch (TypeLoadException tle)
                {
                    //记录Web服务方法参数个数错误日志代码位置 
                    throw new TypeLoadException("Web服务访问方法【" + methodName + "】参数个数不正确,请检查!", new TypeLoadException(tle.StackTrace));
                }
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message, new Exception(ex.StackTrace));
            }
        }
        #endregion

        #region 私有方法 
        /// <summary>                
        /// 得到代理类类型名称                 
        /// </summary>                 
        private void initTypeName()
        {
            Assembly serviceAsm = Assembly.LoadFrom(this._assPath);
            Type[] types = serviceAsm.GetTypes();
            string objTypeName = "";
            foreach (Type t in types)
            {
                if (t.BaseType == typeof(SoapHttpClientProtocol))
                {
                    objTypeName = t.Name;
                    break;
                }
            }
            _typeName = serviceAsm.GetType(this._assName + "." + objTypeName);
        }

        /// <summary>            
        /// 根据web  service文档架构向代理类添加ServiceDescription和XmlSchema               
        /// </summary>                 
        /// <param  name="baseWSDLUrl">web服务地址</param>              
        /// <param  name="importer">代理类</param>               
        private void checkForImports(string baseWsdlUrl, ServiceDescriptionImporter importer)
        {
            DiscoveryClientProtocol dcp = new DiscoveryClientProtocol();
            dcp.DiscoverAny(baseWsdlUrl);
            dcp.ResolveAll();
            foreach (object osd in dcp.Documents.Values)
            {
                if (osd is ServiceDescription) importer.AddServiceDescription((ServiceDescription)osd, null, null); ;
                if (osd is XmlSchema) importer.Schemas.Add((XmlSchema)osd);
            }
        }

        /// <summary>              
        /// 复制程序集到指定路径                
        /// </summary>                 
        /// <param  name="pathToAssembly">程序集路径</param>               
        private void copyTempAssembly(string pathToAssembly)
        {
            File.Copy(pathToAssembly, this._assPath);
        }

        private string getMd5Sum(string str)
        {
            Encoder enc = System.Text.Encoding.Unicode.GetEncoder();
            byte[] unicodeText = new byte[str.Length * 2];
            enc.GetBytes(str.ToCharArray(), 0, str.Length, unicodeText, 0, true);
            MD5 md5 = new MD5CryptoServiceProvider();
            byte[] result = md5.ComputeHash(unicodeText);
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < result.Length; i++)
            {
                sb.Append(result[i].ToString("X2"));
            }
            return sb.ToString();
        }

        /// <summary>              
        /// 是否已经存在该程序集                
        /// </summary>                 
        /// <returns>false:不存在该程序集,true:已经存在该程序集</returns>                
        private bool checkCache()
        {
            if (File.Exists(this._assPath))
            {
                return true;
            }
            return false;
        }

        //私有方法,默认取url入口的文件名为类名 
        private static string getWsclassName(string wsdlUrl)
        {
            string[] parts = wsdlUrl.Split(''/'');
            string[] pps = parts[parts.Length - 1].Split(''.'');
            return pps[0];
        }
        #endregion
    }
View Code

 

.NET WebService 动态调用方法~

.NET WebService 动态调用方法~

.NET WebService 动态调用方法

AJAX ScriptManagerProxy调用webservice

AJAX ScriptManagerProxy调用webservice

内容页:

<%@ Page Title="" Language="C#" MasterPageFile="~/Site1.Master" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="ScriptManagerProxyDemo.WebForm1" %>
<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
<script type="text/javascript">
    function EchoUserInput() {
        var echoElem = $get("EnteredValue");
        alert(echoElem);
        ScriptManagerProxyDemo.WebService1.EchoInput(echoElem.value, OnSucceeded);
    }
    function OnSucceeded(result)
    {
        var RsltElem = $get("Results");
       
        RsltElem.innerHTML=result;
    }
</script>
    <asp:ScriptManagerProxy ID="ScriptManagerProxy1" runat="server">
        <Services>
            <asp:ServiceReference Path="~/WebService1.asmx" />
        </Services>
    </asp:ScriptManagerProxy>
    <input type="text" id="EnteredValue" /><input type="button"  onclick="EchoUserInput()"/>
    <div id="Results"></div>
   
</asp:Content>

 

 

webservice:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;

namespace ScriptManagerProxyDemo
{
    /// <summary>
    /// WebService1 的摘要说明
    /// </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 WebService1 : System.Web.Services.WebService
    {

        [WebMethod]
        public string HelloWorld()
        {
            return "Hello World";
        }
        [WebMethod]
        public string EchoInput(string input)
        {
            string inputString = Server.HtmlEncode(input);
            if (!String.IsNullOrEmpty(inputString))
            {
                return String.Format("您输入了{0}。当前的时间是{1}。",inputString,DateTime.Now);
            }
            else
            {
                return "输入的字符串是NULL或空白";
            }
        }
    }
}


原文链接: http://blog.csdn.net/maji9370/article/details/5483485

Android 4.0 怎么调用Webservice 还有就是怎么调用带SoapHeader的Webservice

Android 4.0 怎么调用Webservice 还有就是怎么调用带SoapHeader的Webservice

Android 4.0 怎么调用Webservice 还有就是怎么调用带SoapHeader的Webservice

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

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

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

今天关于WebServiceProxy---反射调用方法javaweb反射机制的讲解已经结束,谢谢您的阅读,如果想了解更多关于.NET WebService 动态调用方法~、AJAX ScriptManagerProxy调用webservice、Android 4.0 怎么调用Webservice 还有就是怎么调用带SoapHeader的Webservice、ASP.NET中WebService的创建和部署以及通过反射动态调用WebService的相关知识,请在本站搜索。

本文标签: