如题。 
要调用一个基于SOAP的Webservice,对方服务器端的开发环境不详。而且需要身份验证。我通过IP找到WSDL文件。 只用最原始的办法,根据WSDL的描述自己构造SOAP消息,发出去。回复报错401,unauthorized。后来又用SoapUI测试,soap消息不会有问题了,还是报错401。
第一:报错401能不能确定就是用户名和密码的问题?会不会因为我调用的不对,或者开发环境不对,比如服务器端是.NET而我用的是JavaBean。第二:要登陆的话我这里也没有弹出输入身份验证的对话框,wsdl里面也找不到login的方法可以调用。用户名和密码我都知道,但不知道怎么递交给服务器?
很着急,老师一直在等结果,我又是新手搞不定,请各位大侠出手相救/// 在线等
谢谢谢谢谢谢

解决方案 »

  1.   

    第一:认证方式与客户端环境有关。比如客户端是Java 还是 C# 还是 c++
    第二:wsdl里没有认证声明,认证不是webservice soap协议标准的范畴。要在IE里调用方法时才会自动弹出认证选项框,IE里方法调用方式与服务器有关。
      

  2.   

    谢谢帮忙我这里具体情况这样服务器端其实是个机器,因为只给了webservice这一种配置设备的方法,所以我只能用。设备里webservice到底什么开发的说明书没说。我客户端是Netbeans,java写的。浏览器IE。 我记得好像回复消息有个WWW-Authenticate头就能弹出认证框?
    我该怎么办?
      

  3.   

    假如服务器端的webservice是用AXIS写的,调用某一个方法时,可以在IE地址栏中输入http://192.168.0.1/ws/services/service1?method=method1&args=a1,2,true其中http://192.168.0.1/ws/是服务器webservice路径。
    后面service1表示service名,method1表示调用的方法,a1,2,true表示参数在IE中认证一次是不需要重复认证的,与WEB请求的Session是一个道理。在Java客户端时,可能每次都要认证。因为会话不一定保留。在使用AXIS的客户端时,简单认证方式就是创建Call的时候 Service service = new Service();
    Call call = service.createCall();call.setUsername($username);
    call.setPassword($password);
    Object result = call.invoke(new Object[]{"参数1","参数2"});
      

  4.   

    恩,这个AXIS的方法记下了,明天一早去试试看。又有个问题,我个人觉得既然服务器端被封装后留了wsdl描述的接口,那webservice本身是什么开发的是不是已经不重要? 只要调用客户端开发环境所定义的请求认证的方法就可以?  你举的AXIS是个好例子,其他比如xfire或者servlet也有特定的请求认证方法?  希望我理解对了。我另外还有个思路,能不能从浏览器这里下功夫,让自动弹出验证框?浏览器有哪些验证机制?因为这个设备说明书里明确讲了:    This authentication is accomplished by the HTTP AUTH mechanism available in most SOAP clients.他的意思应该是会自动要求输入验证信息的吧? 但我始终不理解这里说的 HTTP AUTH mechanism到底指的什么机制? 比如在Header里加验证吗?还是什么?
      

  5.   

    soap 就是与平台无关,服务器用什么开发的给客户端没关系。自动弹出的话,你每次使用时先链接到一个简单方法,应该会弹出登录框。 HTTP AUTH mechanism  应该说的说是那种简单密码认证方式,就像进办公小路由器时弹出的那种对话框。
      

  6.   

    好 如果是那个base机制 那我早上去试试谢谢
      

  7.   

    终于搞定了 直接用HttpURLConnection是不行的,这个默认只是80端口。最后是用 Java.Net的Authenticator类 把Username和Password直接投过去(他之后对位流的处理遵守http的basic身份验证机制)
    代码很短:
    import java.net.Authenticator;
    import java.net.PasswordAuthentication;class   MyAuthenticator   extends   Authenticator   {
      protected   PasswordAuthentication   getPasswordAuthentication()   {
        return   new   PasswordAuthentication   ( "username ",   "password ");
      }
    }
    在程序中调用:
    Authenticator.setDefault   (new   MyAuthenticator   ()); 希望对以后碰到这个问题的人有用谢谢 trocp