当前位置:编程学习 > C#/ASP.NET >>

C#.Net 如何动态指定URL调用 JAVA WebService



现在地址不明确. 无法通过添加Web引用来调用.


如何根据 参数地址 动态的调用Java XFire WebService




--------------------编程问答-------------------- 有测试用的webservice么   如果不能添加web引用的话是调用不了的
添加引用后项目会根据webservice生成一些方法声明什么的  只要webservice方法不改变  可以更换webservice地址  如果方法改变了就得刷新web引用了

生成对象后可以指定webservice的url   这个地址可以设置在config里面了  

如果都没法引用就不能生成webservice对象  就没办法了 --------------------编程问答--------------------   这个比较简单。
   
  在配置档里对这个Webservices类的对象的url,进行重新指向就行了。 --------------------编程问答--------------------

public static object InvokeWebService(string url,  string methodname, object[] args)


其中,url是Web服务的地址,methodname是要调用服务方法名,args是要调用Web服务所需的参数,返回值就是web服务返回的结果了。


 #region InvokeWebService
        //动态调用web服务
        public static object InvokeWebService(string url, string methodname, object[] args)
         {
            return WebServiceHelper.InvokeWebService(url ,null ,methodname ,args) ;
         }

        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);
                 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 = 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] ;
         }
        #endregion


-----------------------

实例:

 string url = "http://www.webservicex.net/globalweather.asmx" ;
            string[] args = new string[2] ;
             args[0] = this.textBox_CityName.Text ;
             args[1] = "China" ;
            object result = WebServiceHelper.InvokeWebService(url ,"GetWeather" ,args) ;
            this.label_Result.Text = result.ToString() ;


http://www.webservicex.net/globalweather.asmx 服务来获取各大城市的天气状况。
--------------------编程问答--------------------
引用 3 楼 gongsun 的回复:
C# code


public static object InvokeWebService(string url,  string methodname, object[] args)



其中,url是Web服务的地址,methodname是要调用服务方法名,args是要调用Web服务所需的参数,返回值就是web服务返回的结果了。


C# code


 #re……



这段代码我用来动态访问c# 写的能。但是访问java提供的webservice的时候 运行到 Type t = assembly.GetType(@namespace+"."+classname,true,true);
这里就报错了。  目前还不知道什么原因。 java不存在命名空间问题。但是该如何获取type呢? 希望帮忙解答谢谢
补充:.NET技术 ,  Web Services
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,