当前位置: 代码迷 >> Web Service >> c#调用java webservices
  详细解决方案

c#调用java webservices

热度:882   发布时间:2012-01-22 22:38:43.0
求助:c#调用java webservices
如题,今天想用c#调用java webservice 但是,从网上找到的方法似乎不能搞定,希望哪位仁兄给你意见,先拜谢了。。。
调用代码是:
// 1. 使用 WebClient 下载 WSDL 信息。
  WebClient web = new WebClient();
  Stream stream = web.OpenRead("http://202.197.111.164:8082/ZT573DemoAxis2/services/initial?wsdl");

  // 2. 创建和格式化 WSDL 文档。
  ServiceDescription description = ServiceDescription.Read(stream);

  // 3. 创建客户端代理代理类。
  ServiceDescriptionImporter importer = new ServiceDescriptionImporter();

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

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

  // 4. 使用 CodeDom 编译客户端代理类。
  CodeNamespace nmspace = new CodeNamespace(); // 为代理类添加命名空间,缺省为全局空间。
  CodeCompileUnit unit = new CodeCompileUnit();
  unit.Namespaces.Add(nmspace);

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

  CompilerParameters parameter = new CompilerParameters();
  parameter.GenerateExecutable = false;
  parameter.GenerateInMemory = true;
  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);

  // 5. 使用 Reflection 调用 WebService。
  if (!result.Errors.HasErrors)
  {
  Assembly asm = result.CompiledAssembly;

  Console.WriteLine(asm.FullName);
  Type t = asm.GetType("initial"); // 如果在前面为代理类添加了命名空间,此处需要将命名空间添加到类型前面。

  object o = Activator.CreateInstance(t);
  MethodInfo method = t.GetMethod("originalmainkey");
   
   
  Console.WriteLine(method.Invoke(o, null));
  }
=====================================
程序执行至 MethodInfo method = t.GetMethod("originalmainkey"); 抛出异常:TargetInvocationException ,调用的目标发生异常。
而:http://202.197.111.164:8082/ZT573DemoAxis2/services/initial?wsdl是正确的。

急求,答案啊。。。。。。


------解决方案--------------------
这种做法你是从哪里学来的?这种做法真是“闲的没事”,“害你的”!

你只要在vs上你的工程的属性中“添加远程服务(或者web服务)”,然后在出现的窗口中把地址wsdl的http访问地址提交给它,vs就给你生成好本地代理程序了。

你贴出的那些“步骤”,害人不浅!
------解决方案--------------------
很显然,sp1234太狂妄了,事实上,LZ的意思说的很明显,【服务器地址改变时,应用程序就可以根据改变的服务IP重新调用WEB SERVICES】,但是当你打包部署到客户机上的时候,你还能来修改你添加的Web Services地址吗?显然必须重新打包部署,但是用户非常多的时候呢,比如我现在的项目有1k++的人在用,难道当他们的服务器修改地址后(如果没有使用域名转接的话),那这个1k++的人都要重新安装..可想而知..
LZ这样做的目的正是出于这样考虑..
guilipan显然也没搞清楚业务上的需求..正如PEGAMAN所说,为了避免每一次调用都编译,可以保存或存入内存中,这样至少在关闭主程序之前就不会再编译了。
我的做法就是写入静态变量中,在用的时候提取出来,那么只要在第一次调用的时候编译一次就够了。很显然,我看得到自己的效果,第一次确实需要一定的时间,可能会是1s-2s甚至更长一点,但是之后调用那就完全不会了。
  相关解决方案