动态调用webservice

简介:
代码
  protected   string  TestService( string  strurl, string  methodname) 

    System.Net.WebClient client 
=   new  System.Net.WebClient(); 
    String url 
=   "" + strurl + " ?WSDL " ;
    System.IO.Stream stream 
=  client.OpenRead(url); 
    System.Web.Services.Description.ServiceDescription description 
=  System.Web.Services.Description.ServiceDescription.Read(stream); 

    System.Web.Services.Description.ServiceDescriptionImporter importer 
=   new  System.Web.Services.Description.ServiceDescriptionImporter(); // 创建客户端代理代理类。 

    importer.ProtocolName 
=   " Soap " // 指定访问协议。 
    importer.Style  =  System.Web.Services.Description.ServiceDescriptionImportStyle.Client;  // 生成客户端代理。 
    importer.CodeGenerationOptions  =  CodeGenerationOptions.GenerateProperties  |  CodeGenerationOptions.GenerateNewAsync; 

    importer.AddServiceDescription(description, 
null null );  // 添加WSDL文档。 

    CodeNamespace nmspace 
=   new  CodeNamespace();  // 命名空间 
    nmspace.Name  =   " TestWebService "
    CodeCompileUnit unit 
=   new  CodeCompileUnit(); 
    unit.Namespaces.Add(nmspace); 

    ServiceDescriptionImportWarnings warning 
=  importer.Import(nmspace, unit); 
    CodeDomProvider provider 
=  CodeDomProvider.CreateProvider( " CSharp " ); 

    CompilerParameters parameter 
=   new  CompilerParameters(); 
    parameter.GenerateExecutable 
=   false
    parameter.OutputAssembly 
=   " MyTest.dll " ; // 输出程序集的名称 
    parameter.ReferencedAssemblies.Add( " System.dll " ); 
    parameter.ReferencedAssemblies.Add(
" System.XML.dll " ); 
    parameter.ReferencedAssemblies.Add(
" System.Web.Services.dll " ); 
    parameter.ReferencedAssemblies.Add(
" System.Data.dll " ); 

    CompilerResults result 
=  provider.CompileAssemblyFromDom(parameter, unit); 
    
if  (result.Errors.HasErrors) 
    { 
        
//  显示编译错误信息 
    } 

    Assembly asm 
=  Assembly.LoadFrom( " MyTest.dll " ); // 加载前面生成的程序集 
    Type t  =  asm.GetType( " TestWebService.Service " ); 

    
object  o  =  Activator.CreateInstance(t); 
    MethodInfo method 
=  t.GetMethod(methodname); // GetPersons是服务端的方法名称,你想调用服务端的什么方法都可以在这里改,最好封装一下 
    
// String[] item = (String[])method.Invoke(o, null); 
    
// 注:method.Invoke(o, null)返回的是一个Object,如果你服务端返回的是DataSet,这里也是用(DataSet)method.Invoke(o, null)转一下就行了 
    
// foreach (string str in item) 
        
// Console.WriteLine(str); 

    
// 上面是根据WebService地址,模似生成一个代理类,如果你想看看生成的代码文件是什么样子,可以用以下代码保存下来,默认是保存在bin目录下面 
    TextWriter writer  =  File.CreateText( " MyTest.cs " ); 
    provider.GenerateCodeFromCompileUnit(unit, writer, 
null ); 
    writer.Flush(); 
    writer.Close(); 

    
return  method.Invoke(o,  null ).ToString(); 
}

 

    本文转自wengyuli 51CTO博客,原文链接:http://blog.51cto.com/wengyuli/588597,如需转载请自行联系原作者





相关文章
|
3月前
|
Java 网络架构
CXF WebService 授权&动态调用
CXF WebService 授权&动态调用
32 0
|
XML 存储 Java
WebService对象调用spring注解
WebService对象调用spring注解
172 0
|
XML 数据格式 网络架构
httpclent调用webservice
httpclent调用 webservice   wsdl后缀服务 1.jar包: commons-logging-1.
1533 0
|
C# 数据格式 XML
C# 调用WebService的方法
很少用C#动态的去调用Web Service,一般都是通过添加引用的方式,这样的话是自动成了代理,那么动态代理调用就是我们通过代码去调用这个WSDL,然后自己去生成客户端代理。更多的内容可以看下面的两个地址:http://blog.
1087 0
|
Web App开发 Android开发
|
XML Java 数据格式
java接口调用——webservice就是一个RPC而已
  很多新手一听到接口就蒙逼,不知道接口是什么!其实接口就是RPC,通过远程访问别的程序提供的方法,然后获得该方法执行的接口,而不需要在本地执行该方法。就是本地方法调用的升级版而已,我明天会上一篇如何通过socket实现rpc,以及服务的注册和动态上下线。
1416 0