c# 动态调用.net编写的webservices接口

c# 动态调用.net编写的webservices接口

创建类WebServiceHelper:

public class WebServiceHelper
    {
        #region 动态调用WebService动态调用地址
        /// < summary>
        /// 动态调用web服务
        /// < /summary>
        /// < param name="url">WSDL服务地址< /param>
        /// < param name="methodname">方法名< /param>
        /// < param name="args">参数< /param>
        /// < returns>< /returns>
        public static object InvokeWebService(string url, string methodname, object[] args)
        {
            return WebServiceHelper.InvokeWebService(url, null, methodname, args);
        }
       /// <summary>
       /// 动态调用web服务
       /// </summary>
        /// <param name="url">WSDL服务地址</param>
       /// <param name="classname">服务接口类名</param>
        /// <param name="methodname">方法名</param>
       /// <param name="args">参数值</param>
       /// <returns></returns>
        public static object InvokeWebService(string url, string classname, string methodname, object[]args)
        {

            string @namespace = "EnterpriseServerBase.WebService.DynamicWebCalling";
            if ((classname == null) || (classname == ""))
            {
                classname = WebServiceHelper.GetWsClassName(url);
            }
            try
            {

                //获取WSDL
                WebClient wc = new WebClient();
                Stream stream = wc.OpenRead(url + "?WSDL");
                ServiceDescription sd = ServiceDescription.Read(stream);
                //注意classname一定要赋值获取
                 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 icc = new CSharpCodeProvider();

                //设定编译参数
                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 = icc.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);
                return mi.Invoke(obj, args);

            }
            catch (Exception ex)
            {
                throw new Exception(ex.InnerException.Message, new Exception(ex.InnerException.StackTrace));
               // return "Error:WebService调用错误!" + ex.Message;
            }
        }
        private static string GetWsClassName(string wsUrl)
        {
            string[] parts = wsUrl.Split(‘/‘);
            string[] pps = parts[parts.Length - 1].Split(‘.‘);
            return pps[0];
        }
        #endregion
    }
}


1

 

调用操作:

         /// <summary>
         /// 调用操作
          /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {           #region 动态调用 webservices地址
            try
            {

                object[] args = new object[3];
                args[0] = ("参数一");
                args[1] = ("参数二");
                args[2] = ("参数三");

                object result = WebServiceHelper.InvokeWebService("http://112.160.100.110:8000/Service1.asmx", "服务方法:send_message", args);
                string message = result.ToString();

            }

            catch { }
            #endregion
        }

原文地址:http://www.cnblogs.com/Warmsunshine/p/3813551.html

时间: 2024-08-05 07:09:23

c# 动态调用.net编写的webservices接口的相关文章

C#动态调用C++编写的DLL函数

C#动态调用C++编写的DLL函数 动态加载DLL需要使用Windows API函数:LoadLibrary.GetProcAddress以及FreeLibrary.我们可以使用DllImport在C#中使用这三个函数. [DllImport("Kernel32")] public static extern int GetProcAddress(int handle, String funcname); [DllImport("Kernel32")] public

Java cxf 调用.net编写的webservice接口

新到的公司第一份工作就是在java环境下调用前人编写的.net程序编写的webservice接口 接口返回的是JSON格式的数据 因为都说webservice跨语言,本来以为是个简单粗暴的工作,结果发现不是那么回事,.net生成的wsdl文件格式一些标签是java环境下不认识的,需要重新编辑下wsdl文件才行 首先,解压下载的CXF最新版的压缩包,DOS窗口下到bin目录,然后执行 wsdl2java -p ws http://192.168.1.137:8007/CIS_Server.asmx

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

此代码是API.WebSrvices动态调用的类,做接口调用时很实用. Webservices动态调用使用反射的方式很大的缺点是效率低,若有更好的动态调用webservices方法,望各位仁兄不吝贴上代码. using System; using System.IO; using System.Net; using System.Text; using System.Web; using System.Collections.Generic; using System.CodeDom.Compi

Asp.Net 动态调用WebServices解决方案

放狗搜索动态调用webservices 的类,太多.问题挺纠结的.公司需要net调用java的webservices接口,蛋疼的是java端的接口,全部传入String类型的数据.蛋疼啊,接口你不编写成传递参数的形式就算了,尼玛,传递的对象是String(把xml格式化成string类型,在使用报文发送),返回也是String,我纳闷了.按照这个思路,Java端接收报文数据使用Object,返回Object,接口的兼容性岂不是提高了狠多?偏题了... 1.webservices动态类代码 usi

动态调用WebService接口的几种方式

一.什么是WebService? 这里就不再赘述了,想要了解的====>传送门 二.为什么要动态调用WebService接口? 一般在C#开发中调用webService服务中的接口都是通过引用过来就行调用的,步骤如下: 1.找到引用,右击添加服务引用,找到高级,添加web引用,添加之后就可以直接调用里面的方法. 以上这种方法是最简单粗暴的一种方式.当然在开发中总是不那么如意,以上方式是在本机直接可以访问服务的地址,假如在本机不能直接访问WebService,那么就会有些蛋疼. 这种方式就不可取了

linux下动态库的编写和调用

linux下动态库的编写和调用 linux下编写和调用一个简单的动态库大概分为以下几个步骤: - 创建动态库程序文件 add.c int add(int a,int b) { return a+b; } 创建引用头文件 head.c #ifndef _HEAD_ #define _HEAD_ int add(int a,int b); #endif 生成目标文件 生成要加编译器选项 -fpic gcc -fpic -c add.c 然后生成动态库 注意使用链接器选项 -shared gcc -s

C#动态调用WCF接口

C#动态调用WCF接口 写在前面 接触WCF还是它在最初诞生之处,一个分布式应用的巨作. 从开始接触到现在断断续续,真正使用的项目少之又少,更谈不上深入WCF内部实现机制和原理去研究,最近自己做一个项目时用到了WCF. 从这个小项目中我学会了两个地方: 1.利用IIS部署WCF服务,也就是大家接触到的发布SVC文件.2.动态调用WCF接口. 在这个项目中接触WCF时遇到的其实不仅仅是这两个问题,甚至连IIS支持SVC文件也让我折腾了好几把,IIS都重新卸载了两次. 我在这篇文章里用两种方式来实现

两种方法供你动态调用WCF接口

写在前面 接触WCF还是它在最初诞生之处,一个分布式应用的巨作. 从开始接触到现在断断续续,真正使用的项目少之又少,更谈不上深入WCF内部实现机制和原理去研究,最近自己做一个项目时用到了WCF. 从这个小项目中我学会了两个地方: 1.利用IIS部署WCF服务,也就是大家接触到的发布SVC文件.2.动态调用WCF接口. 在这个项目中接触WCF时遇到的其实不仅仅是这两个问题,甚至连IIS支持SVC文件也让我折腾了好几把,IIS都重新卸载了两次. 我在这篇文章里用两种方式来实现. 如何使用 1.第一种

动态调用WebService(C#)

通常我们在程序中需要调用WebService时,都是通过“添加Web引用”,让VS.NET环境来为我们生成服务代理,然后调用对应的Web服务.这样是使工作简单了,但是却和提供Web服务的URL.方法名.参数绑定在一起了,这是VS.NET自动为我们生成Web服务代理的限制.如果哪一天发布Web服务的URL改变了,则我们需要重新让VS.NET生成代理,并重新编译.在某些情况下,这可能是不能忍受的,我们需要动态调用WebService的能力.比如我们可以把Web服务的URL保存在配置文件中,这样,当服