精华内容
下载资源
问答
  • C#动态调用WebService

    2018-10-05 14:35:52
    C#动态调用WebService using System; using System.CodeDom; using System.CodeDom.Compiler; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Reflection;...

    C#动态调用WebService
    上代码

    using System;
    using System.CodeDom;
    using System.CodeDom.Compiler;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using System.Net;
    using System.Reflection;
    using System.Text;
    using System.Threading.Tasks;
    using System.Web.Services.Description;
    
    namespace Jerry_Libr_Framework.WebServiceOperator
    {
        public class CreateWebServiceDLL
        {
            public readonly string Url;
            public CreateWebServiceDLL(string url)
            {
                Url = url;
            }
            //动态调用WebService的方法
    
            //1. 从目标url下载wsdl数据
            //2. 使用ServiceDescription创建和格式化WSDL文档文件
            //3. 使用ServiceDescriptionImporter动态创建客户端代理类
            //4. 使用CodeDom动态创建代理类程序集
            //5. 利用反射调用相关WebService的方法
    
            /***************************代码实现*************************************************************/
    
            
            public void CreateDLLFromUrl()
            {
                //1. 从目标url下载wsdl数据
                WebClient webClient = new WebClient();
                HttpWebRequest.DefaultWebProxy = new WebProxy($"{Url}:80", true);
                Stream stream = webClient.OpenRead($"{Url}?WSDL");
    
                //2. 使用ServiceDescription创建和格式化WSDL文档文件
                ServiceDescription serviceDescription = ServiceDescription.Read(stream);
    
                //3. 使用ServiceDescriptionImporter动态创建客户端代理类
                ServiceDescriptionImporter descriptionImporter = new ServiceDescriptionImporter();
                descriptionImporter.ProtocolName = "SOAP";//设置访问协议
                descriptionImporter.Style = ServiceDescriptionImportStyle.Client;//表示生成客户端代理类
    
                descriptionImporter.CodeGenerationOptions = System.Xml.Serialization.CodeGenerationOptions.GenerateProperties | System.Xml.Serialization.CodeGenerationOptions.GenerateNewAsync;//标准和异步
    
                descriptionImporter.AddServiceDescription(serviceDescription, null, null);
    
    
                //4. 使用CodeDom动态创建代理类程序集
                CodeNamespace codeNamespace = new CodeNamespace("Jerry_Libr_Framework.WebServiceOperator");//指定名称空间,默认为全局名称空间
    
                CodeCompileUnit codeCompileUnit = new CodeCompileUnit();
                codeCompileUnit.Namespaces.Add(codeNamespace);
    
                ServiceDescriptionImportWarnings warnings = descriptionImporter.Import(codeNamespace, codeCompileUnit);
    
                CodeDomProvider codeDomProvider = CodeDomProvider.CreateProvider("CSharp");//使用C#
    
                CompilerParameters compilerParameters = new CompilerParameters();
                compilerParameters.GenerateExecutable = false;//不生成可执行文件
                //compilerParameters.GenerateInMemory = true;
                compilerParameters.OutputAssembly = "SfisWebService.dll";
                compilerParameters.ReferencedAssemblies.Add("System.dll");
                compilerParameters.ReferencedAssemblies.Add("System.XML.dll");
                compilerParameters.ReferencedAssemblies.Add("System.Web.Services.dll");
                compilerParameters.ReferencedAssemblies.Add("System.Data.dll");
    
               CompilerResults results= codeDomProvider.CompileAssemblyFromDom(compilerParameters, codeCompileUnit);
                //5. 利用反射调用相关WebService的方法
    
                if (!results.Errors.HasErrors)
                {
                    Assembly assembly =Assembly.LoadFrom("SfisWebService.dll");
    
                    Type type = assembly.GetType("Jerry_Libr_Framework.WebServiceOperator.SFISTSPWebService");
    
                    object o = Activator.CreateInstance(type);
                    foreach (MethodInfo m in type.GetMethods())
                    {
                        if (m.IsPublic)
                        {
                            Console.WriteLine(m.Name);
                        }                    
                    }
                    //Console.WriteLine(type.GetMethod("GetDatabaseInformation").Invoke(o, null));
                }
            }
        }
    }
    
    展开全文
  • C#动态调用webservice

    2016-06-22 10:33:49
    C#动态调用webservice 方法一: Web Service内容没有变,只是换了各地方。比如从localhost:8080/a.asmx换到了localhost:8090/a.asmx。如此一来你不必重新修改Web Reference只需要在使用WebMethod时 WebS.A a = ...

    C#动态调用webservice

    方法一:

    Web Service内容没有变,只是换了各地方。比如从localhost:8080/a.asmx换到了localhost:8090/a.asmx。如此一来你不必重新修改Web Reference只需要在使用WebMethod时

    WebS.A a = new WebS.A();  
    a.Url="http://localhost:8090/a.asmx"  
    a.remoteDosth();  

    可以把Url字符串存到config里面,用的时候去取。

    方法二:

    private void Page_Load(object sender, System.EventArgs e)  
      {  
       // 在此处放置用户代码以初始化页面  
       object   obj   =   InvokeWebservice("http://localhost/getPro.asmx","EtoonProduct.web.manage","getPro","getArea",new   object[]{"1"});   
       this.DataGrid1.DataSource=obj;  
       this.DataGrid1.DataBind();  
      }   
      /** 根据指定的信息,调用远程WebService方法   
      ///   
      /// WebService的http形式的地址   
      /// 欲调用的WebService的命名空间   
      /// 欲调用的WebService的类名(不包括命名空间前缀)   
      /// 欲调用的WebService的方法名   
      /// 参数列表   
      /// WebService的执行结果   
      ///   
      /// 如果调用失败,将会抛出Exception。请调用的时候,适当截获异常。   
      /// 异常信息可能会发生在两个地方:   
      /// 1、动态构造WebService的时候,CompileAssembly失败。   
      /// 2、WebService本身执行失败。   
      ///   
      ///   
      ///   
      /// object obj = InvokeWebservice("http://localhost/GSP_WorkflowWebservice/common.asmx","Genersoft.Platform.Service.Workflow","Common","GetToolType",new object[]{"1"});   
      ///   
      ///   
      private object InvokeWebservice(string url, string @namespace, string classname, string methodname, object[] args)   
      {   
       try   
       {   
        System.Net.WebClient wc = new System.Net.WebClient();   
        System.IO.Stream stream = wc.OpenRead(url+"?WSDL");   
        System.Web.Services.Description.ServiceDescription sd = System.Web.Services.Description.ServiceDescription.Read(stream);   
        System.Web.Services.Description.ServiceDescriptionImporter sdi = new System.Web.Services.Description.ServiceDescriptionImporter();   
        sdi.AddServiceDescription(sd,"","");   
        System.CodeDom.CodeNamespace cn = new System.CodeDom.CodeNamespace(@namespace);   
        System.CodeDom.CodeCompileUnit ccu = new System.CodeDom.CodeCompileUnit();   
        ccu.Namespaces.Add(cn);   
        sdi.Import(cn,ccu);   
      
        Microsoft.CSharp.CSharpCodeProvider csc = new Microsoft.CSharp.CSharpCodeProvider();   
        System.CodeDom.Compiler.ICodeCompiler icc = csc.CreateCompiler();   
      
        System.CodeDom.Compiler.CompilerParameters cplist = new System.CodeDom.Compiler.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");   
      
        System.CodeDom.Compiler.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));   
       }   
      }   


    展开全文
  • c#动态调用webservice

    2018-05-11 18:49:05
    起因:通过“添加web引用”的常用方式调用webservice,让vs.net环境生成服务代理,然后调用对应的Web服务。这样虽然操作简单,但却和提供webservice的url、方法名、参数进行绑定。若webservice的url、方法、参数发生...
    起因:通过“添加web引用”的 常用方式调用webservice,让vs.net环境生成服务代理,然后调用对应的Web服务。这样虽然操作简单,但却和提供webservice的url、方法名、参数进行绑定。若 webservice的url、方法、参数发生变化,则 需要更新webservice的引用。为了避免多次更新,我们可以 动态生成程序集,通过反射来获取新生成的程序集,并调用其方法
    相关代码:
    public static object InvokeWebService(string url,string methodname,object[] args)
    {
    return this.InvokeWebService(url,null,methodname,args);
    }
    public static object InvokeWebService(string url,string classname,string methodname,object[] args)
    {
    //方法所在的命名空间
    string @namespace = "EnterpriseServerBase.WebService.DynamicWebCalling" ;

    //方法所在的类,此处若为空,则从url中获取
    if((classname == null) ||(classname == ""))
    {
    classname = WebServiceHelper.GetWsClassName(url) ;
    }

    try
    {
    //获取WSDL
    WebClient wc = new WebClient();
    //创建读数据流
    Stream stream = wc.OpenRead(url+"?WSDL");
    //读取webservice数据流
    ServiceDescription sd = ServiceDescription.Read(stream);
    //创建XMl Web Service客户端代理类
    ServiceDescriptionImporter sdi = new ServiceDescriptionImporter();
    //将ServiceDescription添加至客户端代理类中
    sdi.AddServiceDescription(sd,"","");
    //创建命名空间
    CodeNamespace cn = new CodeNamespace(@namespace);
    //生成客户端代理类代码
    CodeCompileUnit ccu = new CodeCompileUnit();
    ccu.Namespaces.Add(cn);
    //导入生成代码至CodeCompileUnit中
    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 = 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));
    }
    }

    private static string GetWsClassName(string wsUrl)
    {
    string[] parts = wsUrl.Split('/') ;
    string[] pps = parts[parts.Length-1].Split('.') ;

    return pps[0] ;
    }




    展开全文
  • 介绍了c#动态调用Webservice的两种方法实例,有需要的朋友可以参考一下
  • c#动态调用WebService

    2018-08-07 18:15:41
    https://www.cnblogs.com/leolion/p/4757320.html
    展开全文
  • C# 动态调用WebService

    千次阅读 2014-02-21 19:24:37
    C#调用WebService的方式有很多: 1、直接在项目中添加WebService引用,这种方式比较简单,但不是动态的,即每次服务地址或者内容变了之后都要重新添加引用。 2、用Soap,这种方式需要把添加WebService引用生成的...
  • C#动态调用webservice服务 先初始化类 WebServiceCall.WebServiceCall webservicecall1 = new WebServiceCall.WebServiceCall(); 然后调用方法 WebService()
  • C#动态调用webservice(VS2010)

    热门讨论 2013-03-07 17:00:53
    C#动态调用webservice 项目使用VS2010开发 测试项目为一个winform程序
  • 本方案实现了动态调用WebService服务,我们可以把Web服务的URL保存在配置文件中,这样,当服务URL改变时,只需要修改配置文件就可以了。
  • C# 动态调用webService

    2009-03-10 15:32:00
    结果在引用那添加是可以的,但是现在我们那个webservice还没写出来,所以就想用动态调用webservice。所以找了很多资料看了看,也在网上查了查,发现一个不错的方法,所以转载过来。 using System;using System.Web....
  • C#动态调用webservice.rar

    2019-07-02 15:43:49
    C#实现反向代理动态调用webservice,避免每次需要引入web或者url
  • 本demo主要写了是怎么动态调用WebService服务,逻辑清晰。
  • WebServiceHelper代码: using Microsoft.CSharp; using System; using System.CodeDom; using System.CodeDom.Compiler; using System.Collections.Generic; using System.IO;...using System.Xml.
  • 今天写了一个C#调用WebService公共类,供以后借鉴学习 public class CommonWebService { /// <summary> /// WebService 超时设置 /// </summary> private int outTime = 1000; ...
  • C#动态调用webService出现 基础连接已经关闭: 未能为 SSL/TLS 安全通道建立信任关系,通过具体的内容向大家展示,希望对大家学习C#编程有所帮助。 这里因为的原因是https请求要检查证书,有些证书不正确的,网页...
  • 以上代码用于动态调用WebService,其中_wsdlUrl在构造函数中赋url地址值,但是执行时间需要较长的方法时,将引发超时,之前采用直接引用WebService的方式可以设置TimeOut参数,如已有的Web引用名称为DAWebService...
  • C#动态调用webservice的方法

    千次阅读 2016-05-19 11:21:22
    如果需要动态调用WebService,要实现这样的功能: publicstaticobjectInvoke WebService(stringurl, stringmethodname,object[] args) 其中,url是Web服务的地址,methodname是要调用服务方法名,args是要...
  • C#动态调用WebService方法之WS代理

    千次阅读 2017-04-18 14:24:51
    通常我们在程序中需要调用WebService时,都是通过“添加Web引用”,让VS.NET环境来为我们生成服务代理,然后调用对应的Web服务。这样是使工作简单了,但是却和提供Web服务的URL、方法名、参数绑定在一起了,这是VS...
  • C# 动态调用 WebService 的封装

    千次阅读 2015-06-11 21:43:09
    简单的调用示例: WebServiceAgent ag = new WebServiceAgent("http://www.webservicex.net/globalweather.asmx"); resultStr = (string)ag.Invoke("GetWeather", "Beijing", "China");
  • C#动态webservice调用接口 1 using System; 2 using System.Collections; 3 using System.IO; 4 using System.Net; 5 using System.Text; 6 using System.Xml; 7 using System.Xml.Serializ...
  • 动态调用某平台提供的服务时, 这两句 WebClient wc = new WebClient(); Stream stream = wc.OpenRead(url + "?WSDL"); 第一次调用的时候没有任何问题,第二次调用就会卡在第二句,然后报错:操作超时 两次...
  • 这里是调用一个WebService 接口调用函数生成的类的使用,参数:WebService 地址Url,接口方法名,和接口方法参数 调用方法的代码 public object GetDataByWebService(string url, string menthod, object[] args...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 18,959
精华内容 7,583
关键字:

c#动态调用webservice

c# 订阅