none
WebService 缺少命名空间为 http://webservice.webapp.beanpod.becom.com/ 的服务说明 RRS feed

  • 问题

  • 动态调用java的WebService,在网上找的代码如下

    using System;
    using System.Net;
    using System.IO;
    using System.CodeDom;
    using Microsoft.CSharp;
    using System.CodeDom.Compiler;
    using System.Web.Services.Description;
    using System.Web.Services.Protocols;
    
    
    namespace WebServiceTest
    {
        class WebServiceHelper
        {
            #region InvokeWebService
            /// < summary>   
            /// 动态调用web服务   
            /// < /summary>   
            /// < param name="url">WSDL服务地址< /param>   
            /// < param name="methodname">方法名< /param>   
            /// < param name="args">参数< /param>   
            /// < returns>< /returns>   
            public static object InvokeWebService(string url, string methodname, object[] args)
            {
                return WebServiceHelper.InvokeWebService(url, null, methodname, args);
            }
    
            /// < summary>   
            /// 动态调用web服务   
            /// < /summary>   
            /// < param name="url">WSDL服务地址< /param>   
            /// < param name="classname">类名< /param>   
            /// < param name="methodname">方法名< /param>   
            /// < param name="args">参数< /param>   
            /// < returns>< /returns>   
            public static object InvokeWebService(string url, string classname, string methodname, object[] args)
            {
                string @namespace = "LoginInterface";
                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 icc = new CSharpCodeProvider();
    
                    //设定编译参数   
                    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);
    
                    /*   
                    PropertyInfo propertyInfo = type.GetProperty(propertyname);   
                    return propertyInfo.GetValue(obj, null);   
                    */
                }
                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://192.168.0.107:8081/beanpod/ws/loginMangerService";
                string[] paras = new string[2];
                paras[0] = "299";
                paras[1] = "e10adc3949ba59abbe56e057f20f883e";
                object result = WebServiceHelper.InvokeWebService(url, "LoginMangerServiceClient", "onSuccessfulAuthentication", paras);
                if (result is string)
                {
                    Console.WriteLine(result.ToString());
                }


    于是出现了下面的异常:

    System.ArgumentException: 找不到 http://webservice.webapp.beanpod.becom.com/:ILoginMangerService 的定义。缺少命名空间为 http://webservice.webapp.beanpod.becom.com/ 的服务说明。
    参数名: name
       在 System.Web.Services.Description.ServiceDescriptionCollection.GetServiceDescription(XmlQualifiedName name)
       在 System.Web.Services.Description.ServiceDescriptionCollection.GetPortType(XmlQualifiedName name)
       在 System.Web.Services.Description.ProtocolImporter.GenerateCode(CodeNamespace codeNamespace, ImportContext importContext, Hashtable exportContext)
       在 System.Web.Services.Description.ServiceDescriptionImporter.Import(CodeNamespace codeNamespace, ImportContext importContext, Hashtable exportContext, StringCollection warnings)
       在 System.Web.Services.Description.ServiceDescriptionImporter.Import(CodeNamespace codeNamespace, CodeCompileUnit codeCompileUnit),

    但是我添加服务引用,然后输入

      http://192.168.0.107:8081/beanpod/ws/loginMangerService?wsdl

    再设置命名空间LoginInterface,然后在程序中写代码:

    LoginInterface.LoginMangerServiceClient lmsc = new LoginInterface.LoginMangerServiceClient();
                string username = lmsc.onSuccessfulAuthentication("299", "e10adc3949ba59abbe56e057f20f883e");
                Console.WriteLine(username);

    是可以调用的。

    如果我在浏览器中访问WebService:http://192.168.0.107:8081/beanpod/ws/loginMangerService?wsdl,也是可以的,会出现如下xml文件:

    <?xml version="1.0" encoding="UTF-8"?> <wsdl:definitions targetNamespace="http://impl.webservice.webapp.beanpod.becom.com/"

    name="LoginMangerServiceService" xmlns:xsd="http://www.w3.org/2001/XMLSchema"

    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://impl.webservice.webapp.beanpod.becom.com/"

    xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"

    xmlns:ns1="http://webservice.webapp.beanpod.becom.com/">

    <wsdl:import namespace="http://webservice.webapp.beanpod.becom.com/" location="http://192.168.0.107:8081/beanpod/ws/loginMangerService?wsdl=ILoginMangerService.wsdl">

    </wsdl:import>

    <wsdl:binding name="LoginMangerServiceServiceSoapBinding" type="ns1:ILoginMangerService">

    <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>

    <wsdl:operation name="onSuccessfulAuthentication">

    <soap:operation style="document" soapAction=""/>

    <wsdl:input name="onSuccessfulAuthentication">

    <soap:body use="literal"/>

    </wsdl:input>

    <wsdl:output name="onSuccessfulAuthenticationResponse"><soap:body use="literal"/>

    </wsdl:output>

    </wsdl:operation>

    </wsdl:binding>

    <wsdl:service name="LoginMangerServiceService">

    <wsdl:port name="LoginMangerServicePort" binding="tns:LoginMangerServiceServiceSoapBinding">

    <soap:address location="http://192.168.0.107:8081/beanpod/ws/loginMangerService"/>

    </wsdl:port>

    </wsdl:service>

    </wsdl:definitions>

    从异常来看我觉得是命名空间的问题,因为无论怎么换命名空间,异常都是找不到 http://webservice.webapp.beanpod.becom.com/:ILoginMangerService 的定义,说明命名空间对代码不起作用,打断点发现程序每次执行到

    sdi.Import(cn, ccu);

    就会报异常,但是命名空间试了N次都没有解决问题,请大侠们帮帮忙啊.

    • 已更改类型 占占wyz 2013年7月17日 11:53 提出的问题不是ADO.NET与LINQ的
    • 已更改类型 占占wyz 2013年7月17日 11:54 想把问题改到.net framework一般讨论区,改错了
    • 已移动 Chester Hong 2013年7月22日 5:17
    2013年7月17日 11:48

答案

全部回复

  • 刚又用.net创建了一个WebService,将类名的命名空间给

    CodeNamespace cn = new CodeNamespace(@namespace);

    不会出现问题,所以现在问题范围基本上已经缩小到java那边的命名空间是什么了。试了好多个命名空间都不行。实现类com.becom.beanpod.webapp.webservice.impl

    实现类的接口com.becom.beanpod.webapp.webservice,等等都不行,请大虾帮忙啊

    2013年7月18日 1:31
  • 如果用添加服务引用那种方式来添加webservice的话,其实在app.config文件中自动就有webservice的路径了,

    已经解决了动态配置ip的问题,这事微软给封装好的,但是用纯代码的方式调用webservice为什么就不行呢?

    2013年7月20日 5:29
  • 抱歉,这个不是ADO.NET的相关问题,我将要把它移到一般性问题讨论区。

    Chester Hong
    MSDN Community Support | Feedback to us
    Develop and promote your apps in Windows Store
    Please remember to mark the replies as answers if they help and unmark them if they provide no help

    2013年7月22日 5:17
  • 还是用IDE通过添加服务引用的方式来创建webservice吧
    • 已标记为答案 占占wyz 2014年4月9日 5:57
    2014年4月9日 5:57
  • 楼主问题解决了吗,我也遇到sdi.Import(cn, ccu);报错的问题了,请问怎么解决呢
    2018年3月7日 8:23
  • 层主解决了吗?同求解决方法啊。我这需求还必须使用wsdl,不能直接引用。

    2018年3月29日 6:10
  • 解决了吗,我这也是这个错误,怎么解决啊,还得动态调用

    2018年10月11日 3:36
  • 楼主,这个动态的解决了吗,如何解决的啊

    2018年10月11日 3:37
  • 您好,调用外部的webservice有两种方式,一种是网上找的纯代码调用,我也一直没有调用成功。另一种就是通过visual studio添加服务引用的方式来创建webservice,这种基本是不需要写代码的,就是一直下一步就可以了,这样调用就不会出现sdi.Import(cn, ccu);报错的问题了。您可以试试,有问题再留言
    2019年3月15日 13:10
  • 您好,调用外部的webservice有两种方式,一种是网上找的纯代码调用,我也一直没有调用成功。另一种就是通过visual studio添加服务引用的方式来创建webservice,这种基本是不需要写代码的,就是一直下一步就可以了,这样调用就不会出现sdi.Import(cn, ccu);报错的问题了。您可以试试,有问题再留言
    2019年3月15日 13:10
  • 您好,调用外部的webservice有两种方式,一种是网上找的纯代码调用,我也一直没有调用成功。另一种就是通过visual studio添加服务引用的方式来创建webservice,这种基本是不需要写代码的,就是一直下一步就可以了,这样调用就不会出现sdi.Import(cn, ccu);报错的问题了。您可以试试,有问题再留言
    2019年3月15日 13:10
  • 您好,调用外部的webservice有两种方式,一种是网上找的纯代码调用,我也一直没有调用成功。另一种就是通过visual studio添加服务引用的方式来创建webservice,这种基本是不需要写代码的,就是一直下一步就可以了,这样调用就不会出现sdi.Import(cn, ccu);报错的问题了。您可以试试,有问题再留言
    2019年3月15日 13:10