C#动态调用webservice 2

来源:互联网 发布:php防止重复加分 编辑:程序博客网 时间:2024/04/27 17:52

 

方法一:
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 static object InvokeWebservice(string url, string namespacestr, string classname, string methodname, object[] args)
        {
            try
            {
                if (!url.ToUpper().EndsWith("?WSDL"))
                    url += "?WSDL";
                //String url = "http://localhost:3182/Service1.asmx?WSDL";//这个地址可以写在Config文件里面,这里取出来就行了.在原地址后面加上: ?WSDL
                WebClient client = new WebClient();
                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 = System.Xml.Serialization.CodeGenerationOptions.GenerateProperties | System.Xml.Serialization.CodeGenerationOptions.GenerateNewAsync;
                importer.AddServiceDescription(description, null, null); //添加WSDL文档。
                System.CodeDom.CodeNamespace nmspace = new System.CodeDom.CodeNamespace(); //命名空间
                nmspace.Name = namespacestr;
                System.CodeDom.CodeCompileUnit unit = new System.CodeDom.CodeCompileUnit();
                unit.Namespaces.Add(nmspace);
                System.Web.Services.Description.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(namespacestr + "." + classname);
                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);
                object obj = method.Invoke(o, args);
                //上面是根据WebService地址,模似生成一个代理类,如果你想看看生成的代码文件是什么样子,可以用以下代码保存下来,默认是保存在bin目录下面
                TextWriter writer = File.CreateText("MyTest.cs");
                provider.GenerateCodeFromCompileUnit(unit, writer, null);
                writer.Flush();
                writer.Close();
                return obj;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
原创粉丝点击