在帮客户写JAVA客户端访问.NET实现的Web service的示例代码发现了一个有趣的问题。为有保障安全性,使用了wse2.0 sp2的ws-security,自己实现了UsernameTokenManager的AuthenticateToken方法。当从本机的浏览器访问该服务时,返回HTTP 500错误。写了一个winform客户端的测试代码,当使用不正确的用户名与密码时,服务抛出错误,使用正确的用户名与密码时,服务返回正确的结果,一切看起来都很正常。但当使用java的客户端访问时,无论使用什么样的客户名与密码,服务均能正确返回结果。不知道是否WSE2.0的bug还是设置的问题,让jeet很是郁闷。
示例代码如下:
1、WEB service代码:

WSE2.0的BUG?!using System;
WSE2.0的BUG?!
using System.Collections;
WSE2.0的BUG?!
using System.ComponentModel;
WSE2.0的BUG?!
using System.Data;
WSE2.0的BUG?!
using System.Diagnostics;
WSE2.0的BUG?!
using System.Web;
WSE2.0的BUG?!
using System.Web.Services;
WSE2.0的BUG?!
using System.Web.Services.Protocols;
WSE2.0的BUG?!
using Microsoft.Web.Services2;
WSE2.0的BUG?!
using Microsoft.Web.Services2.Security;
WSE2.0的BUG?!
using Microsoft.Web.Services2.Security.Tokens;
WSE2.0的BUG?!
WSE2.0的BUG?!
namespace WebTest
{

WSE2.0的BUG?!    
/// SumService 的摘要说明。
WSE2.0的BUG?!    
/// </summary>
WSE2.0的BUG?!    public class SumService : System.Web.Services.WebService
{
WSE2.0的BUG?!        
public SumService()
{
WSE2.0的BUG?!            
//CODEGEN: 该调用是 ASP.NET Web 服务设计器所必需的
WSE2.0的BUG?!
            InitializeComponent();
WSE2.0的BUG?!        }

WSE2.0的BUG?!

WSE2.0的BUG?!        
WSE2.0的BUG?!        
//Web 服务设计器所必需的
WSE2.0的BUG?!
        private IContainer components = null;
WSE2.0的BUG?!                

WSE2.0的BUG?!        
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
WSE2.0的BUG?!        
/// 此方法的内容。
WSE2.0的BUG?!        
/// </summary>
WSE2.0的BUG?!        private void InitializeComponent()
{
WSE2.0的BUG?!        }

WSE2.0的BUG?!

WSE2.0的BUG?!        
/// 清理所有正在使用的资源。
WSE2.0的BUG?!        
/// </summary>
WSE2.0的BUG?!        protected override void Dispose( bool disposing )
{
WSE2.0的BUG?!            
if(disposing && components != null)
{
WSE2.0的BUG?!                components.Dispose();
WSE2.0的BUG?!            }

WSE2.0的BUG?!            
base.Dispose(disposing);        
WSE2.0的BUG?!        }

WSE2.0的BUG?!        
WSE2.0的BUG?!        
#endregion
WSE2.0的BUG?!
WSE2.0的BUG?!        
// WEB 服务示例
WSE2.0的BUG?!        
// HelloWorld() 示例服务返回字符串 Hello World
WSE2.0的BUG?!        
// 若要生成,请取消注释下列行,然后保存并生成项目
WSE2.0的BUG?!        
// 若要测试此 Web 服务,请按 F5 键
WSE2.0的BUG?!
//
WSE2.0的BUG?!
        [WebMethod]
WSE2.0的BUG?!        
public string HelloWorld()
{
WSE2.0的BUG?!            SoapContext requestContext
=RequestSoapContext.Current;
WSE2.0的BUG?!            
if(requestContext==null)
WSE2.0的BUG?!                
throw new ApplicationException("Only soap request are permitted.");
WSE2.0的BUG?!            
return "Hello World.";
WSE2.0的BUG?!        }

WSE2.0的BUG?!        [SoapRpcMethod(Action
="http://www.gds-china.com/Rpc",RequestNamespace="http://www.gds-china.com/SU",ResponseNamespace="http://www.gds-china.com/SU")]
WSE2.0的BUG?!        [WebMethod]
WSE2.0的BUG?!        
public int IntAdd(int a,int b)
{
WSE2.0的BUG?!            SoapContext requestContext
=RequestSoapContext.Current;
WSE2.0的BUG?!            
WSE2.0的BUG?!            
if(requestContext==null)
WSE2.0的BUG?!                
throw new ApplicationException("Only soap request are permitted.");
WSE2.0的BUG?!            
WSE2.0的BUG?!
WSE2.0的BUG?!            
return a+b;
WSE2.0的BUG?!        }

WSE2.0的BUG?!
WSE2.0的BUG?!        
WSE2.0的BUG?!    }

WSE2.0的BUG?!    }

WSE2.0的BUG?!

2、实现UsernameTokenManager
WSE2.0的BUG?!using System;
WSE2.0的BUG?!
using Microsoft.Web.Services2;
WSE2.0的BUG?!
using Microsoft.Web.Services2.Security;
WSE2.0的BUG?!
using Microsoft.Web.Services2.Security.Tokens;
WSE2.0的BUG?!
using System.Security;
WSE2.0的BUG?!
using System.Security.Permissions;
WSE2.0的BUG?!
WSE2.0的BUG?!
namespace WebTest
{

WSE2.0的BUG?!    
/// CustomUsernameTokenManager 的摘要说明。
WSE2.0的BUG?!    
/// </summary>
WSE2.0的BUG?!    [SecurityPermission(SecurityAction.Demand,
WSE2.0的BUG?!         Flags
= SecurityPermissionFlag.UnmanagedCode)]
WSE2.0的BUG?!
WSE2.0的BUG?!    
public class CustomUsernameTokenManager:UsernameTokenManager
{
WSE2.0的BUG?!        
public CustomUsernameTokenManager()
{
WSE2.0的BUG?!            
//
WSE2.0的BUG?!            
// TODO: 在此处添加构造函数逻辑
WSE2.0的BUG?!            
//
WSE2.0的BUG?!
        }
WSE2.0的BUG?!
WSE2.0的BUG?!        
protected override string AuthenticateToken(UsernameToken token)
{
WSE2.0的BUG?!            
if(token==null)
WSE2.0的BUG?!                
throw new ArgumentNullException();
WSE2.0的BUG?!            
if(token.Username=="username")
WSE2.0的BUG?!                
return "password";
WSE2.0的BUG?!            
else
WSE2.0的BUG?!                
return "love";
WSE2.0的BUG?!            
WSE2.0的BUG?!
//                byte[] encodedUsername=System.Text.Encoding.UTF8.GetBytes(token.Username);
WSE2.0的BUG?!
//                if(System.Text.Encoding.UTF8.GetString(encodedUsername)=="username")
WSE2.0的BUG?!
//                    return "password";
WSE2.0的BUG?!
//            else
WSE2.0的BUG?!
//                    return "love";
WSE2.0的BUG?!

WSE2.0的BUG?!        }

WSE2.0的BUG?!
WSE2.0的BUG?!    }

WSE2.0的BUG?!}

WSE2.0的BUG?!

3、Web service的web.config配置
WSE2.0的BUG?!<?xml version="1.0" encoding="utf-8"?>
WSE2.0的BUG?!
<configuration>
WSE2.0的BUG?!  
<configSections>
WSE2.0的BUG?!    
<section name="microsoft.web.services2" type="Microsoft.Web.Services2.Configuration.WebServicesConfiguration, Microsoft.Web.Services2, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
WSE2.0的BUG?!  
</configSections>
WSE2.0的BUG?!  
<system.web>
WSE2.0的BUG?!    
<webServices>
WSE2.0的BUG?!      
<protocols>
WSE2.0的BUG?!        
<remove name="HttpGet" />
WSE2.0的BUG?!        
<remove name="HttpPost" />
WSE2.0的BUG?!      
</protocols>
WSE2.0的BUG?!      
<soapExtensionTypes>
WSE2.0的BUG?!        
<add type="Microsoft.Web.Services2.WebServicesExtension, Microsoft.Web.Services2, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" priority="1" group="0" />
WSE2.0的BUG?!      
</soapExtensionTypes>
WSE2.0的BUG?!    
</webServices>
WSE2.0的BUG?!    
<!--  动态调试编译
WSE2.0的BUG?!          设置 compilation debug="true" 以启用 ASPX 调试。否则,将此值设置为
WSE2.0的BUG?!          false 将提高此应用程序的运行时性能。
WSE2.0的BUG?!          设置 compilation debug="true" 以将调试符号(.pdb 信息)
WSE2.0的BUG?!          插入到编译页中。因为这将创建执行起来
WSE2.0的BUG?!          较慢的大文件,所以应该只在调试时将此值设置为 true,而在所有其他时候都设置为
WSE2.0的BUG?!          false。有关更多信息,请参考有关
WSE2.0的BUG?!          调试 ASP.NET 文件的文档。
WSE2.0的BUG?!    
-->
WSE2.0的BUG?!    
<compilation defaultLanguage="c#" debug="true" />
WSE2.0的BUG?!    
<!--  自定义错误信息
WSE2.0的BUG?!          设置 customErrors mode="On" 或 "RemoteOnly" 以启用自定义错误信息,或设置为 "Off" 以禁用自定义错误信息。 
WSE2.0的BUG?!          为每个要处理的错误添加 <error> 标记。
WSE2.0的BUG?!
WSE2.0的BUG?!          "On" 始终显示自定义(友好的)信息。
WSE2.0的BUG?!          "Off" 始终显示详细的 ASP.NET 错误信息。
WSE2.0的BUG?!          "RemoteOnly" 只对不在本地 Web 服务器上运行的
WSE2.0的BUG?!           用户显示自定义(友好的)信息。出于安全目的,建议使用此设置,以便 
WSE2.0的BUG?!           不向远程客户端显示应用程序的详细信息。
WSE2.0的BUG?!    
-->
WSE2.0的BUG?!    
<customErrors mode="RemoteOnly" />
WSE2.0的BUG?!    
<identity impersonate="true" />
WSE2.0的BUG?!    
<!--  身份验证 
WSE2.0的BUG?!          此节设置应用程序的身份验证策略。可能的模式是 "Windows"、 
WSE2.0的BUG?!          "Forms"、 "Passport" 和 "None"
WSE2.0的BUG?!
WSE2.0的BUG?!          "None" 不执行身份验证。 
WSE2.0的BUG?!          "Windows" IIS 根据应用程序的设置执行身份验证 
WSE2.0的BUG?!            (基本、简要或集成 Windows)。在 IIS 中必须禁用匿名访问。
WSE2.0的BUG?!          "Forms" 您为用户提供一个输入凭据的自定义窗体(Web 页),然后 
WSE2.0的BUG?!           在您的应用程序中验证他们的身份。用户凭据标记存储在 Cookie 中。
WSE2.0的BUG?!          "Passport" 身份验证是通过 Microsoft 的集中身份验证服务执行的,
WSE2.0的BUG?!           它为成员站点提供单独登录和核心配置文件服务。
WSE2.0的BUG?!    
-->
WSE2.0的BUG?!    
<authentication mode="Windows" />
WSE2.0的BUG?!    
<!--  授权 
WSE2.0的BUG?!           此节设置应用程序的授权策略。可以允许或拒绝不同的用户或角色访问
WSE2.0的BUG?!          应用程序资源。通配符: "*" 表示任何人,"?" 表示匿名
WSE2.0的BUG?!          (未经身份验证的)用户。
WSE2.0的BUG?!    
-->
WSE2.0的BUG?!    
<authorization>
WSE2.0的BUG?!      
<allow users="*" />
WSE2.0的BUG?!      
<!-- 允许所有用户 -->
WSE2.0的BUG?!      
<!--  <allow     users="[逗号分隔的用户列表]"
WSE2.0的BUG?!                             roles="[逗号分隔的角色列表]"/>
WSE2.0的BUG?!                  <deny      users="[逗号分隔的用户列表]"
WSE2.0的BUG?!                             roles="[逗号分隔的角色列表]"/>
WSE2.0的BUG?!            
-->
WSE2.0的BUG?!    
</authorization>
WSE2.0的BUG?!    
<!--  应用程序级别跟踪记录
WSE2.0的BUG?!          应用程序级别跟踪为应用程序中的每一页启用跟踪日志输出。
WSE2.0的BUG?!          设置 trace enabled="true" 可以启用应用程序跟踪记录。如果 pageOutput="true",则
WSE2.0的BUG?!          在每一页的底部显示跟踪信息。否则,可以通过浏览 Web 应用程序
WSE2.0的BUG?!           根目录中的 "trace.axd" 页来查看
WSE2.0的BUG?!          应用程序跟踪日志。
WSE2.0的BUG?!    
-->
WSE2.0的BUG?!    
<trace enabled="false" requestLimit="10" pageOutput="false" traceMode="SortByTime" localOnly="true" />
WSE2.0的BUG?!    
<!--  会话状态设置
WSE2.0的BUG?!          默认情况下,ASP.NET 使用 Cookie 来标识哪些请求属于特定的会话。
WSE2.0的BUG?!          如果 Cookie 不可用,则可以通过将会话标识符添加到 URL 来跟踪会话。
WSE2.0的BUG?!         若要禁用 Cookie,请设置 sessionState cookieless="true"。
WSE2.0的BUG?!    
-->
WSE2.0的BUG?!    
<sessionState mode="InProc" stateConnectionString="tcpip=127.0.0.1:42424" sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes" cookieless="false" timeout="20" />
WSE2.0的BUG?!    
<!--  全球化
WSE2.0的BUG?!          此节设置应用程序的全球化设置。
WSE2.0的BUG?!    
-->
WSE2.0的BUG?!    
<globalization requestEncoding="utf-8" responseEncoding="utf-8" />
WSE2.0的BUG?!  
</system.web>
WSE2.0的BUG?!  
<microsoft.web.services2>
WSE2.0的BUG?!    
<diagnostics>
WSE2.0的BUG?!      
<trace enabled="true" input="InputTrace.webinfo" output="OutputTrace.webinfo" />
WSE2.0的BUG?!      
<detailedErrors enabled="false" />
WSE2.0的BUG?!    
</diagnostics>
WSE2.0的BUG?!    
<security>
WSE2.0的BUG?!        
<securityTokenManager type="WebTest.CustomUsernameTokenManager,WebTest" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" qname="wsse:UsernameToken" />
WSE2.0的BUG?!    
</security>
WSE2.0的BUG?!  
</microsoft.web.services2>
WSE2.0的BUG?!
</configuration>

4、试验的.net客户端代码
WSE2.0的BUG?!using System;
WSE2.0的BUG?!
using System.Drawing;
WSE2.0的BUG?!
using System.Collections;
WSE2.0的BUG?!
using System.ComponentModel;
WSE2.0的BUG?!
using System.Windows.Forms;
WSE2.0的BUG?!
using System.Data;
WSE2.0的BUG?!
using Microsoft.Web.Services2;
WSE2.0的BUG?!
using Microsoft.Web.Services2.Security;
WSE2.0的BUG?!
using Microsoft.Web.Services2.Security.Tokens;
WSE2.0的BUG?!
using GDS.Ldap;
WSE2.0的BUG?!
using System.Text;
WSE2.0的BUG?!
WSE2.0的BUG?!
namespace WSEClientTest
{

WSE2.0的BUG?!    
/// Form1 的摘要说明。
WSE2.0的BUG?!    
/// </summary>
WSE2.0的BUG?!    public class Form1 : System.Windows.Forms.Form
{
WSE2.0的BUG?!        
private System.Windows.Forms.Button button1;
WSE2.0的BUG?!        

WSE2.0的BUG?!        
/// 必需的设计器变量。
WSE2.0的BUG?!        
/// </summary>
WSE2.0的BUG?!        private System.ComponentModel.Container components = null;
WSE2.0的BUG?!
WSE2.0的BUG?!        
public Form1()
{
WSE2.0的BUG?!            
//
WSE2.0的BUG?!            
// Windows 窗体设计器支持所必需的
WSE2.0的BUG?!            
//
WSE2.0的BUG?!
            InitializeComponent();
WSE2.0的BUG?!
WSE2.0的BUG?!            
//
WSE2.0的BUG?!            
// TODO: 在 InitializeComponent 调用后添加任何构造函数代码
WSE2.0的BUG?!            
//
WSE2.0的BUG?!
        }
WSE2.0的BUG?!

WSE2.0的BUG?!        
/// 清理所有正在使用的资源。
WSE2.0的BUG?!        
/// </summary>
WSE2.0的BUG?!        protected override void Dispose( bool disposing )
{
WSE2.0的BUG?!            
if( disposing )
{
WSE2.0的BUG?!                
if (components != null
{
WSE2.0的BUG?!                    components.Dispose();
WSE2.0的BUG?!                }

WSE2.0的BUG?!            }

WSE2.0的BUG?!            
base.Dispose( disposing );
WSE2.0的BUG?!        }

WSE2.0的BUG?!


WSE2.0的BUG?!        
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
WSE2.0的BUG?!        
/// 此方法的内容。
WSE2.0的BUG?!        
/// </summary>
WSE2.0的BUG?!        private void InitializeComponent()
{
WSE2.0的BUG?!            
this.button1 = new System.Windows.Forms.Button();
WSE2.0的BUG?!            
WSE2.0的BUG?!            
this.SuspendLayout();
WSE2.0的BUG?!            
// 
WSE2.0的BUG?!            
// button1
WSE2.0的BUG?!            
// 
WSE2.0的BUG?!
            this.button1.Location = new System.Drawing.Point(3232);
WSE2.0的BUG?!            
this.button1.Name = "button1";
WSE2.0的BUG?!            
this.button1.TabIndex = 0;
WSE2.0的BUG?!            
this.button1.Text = "button1";
WSE2.0的BUG?!            
this.button1.Click += new System.EventHandler(this.button1_Click);
WSE2.0的BUG?!        
WSE2.0的BUG?!            
// 
WSE2.0的BUG?!            
// Form1
WSE2.0的BUG?!            
// 
WSE2.0的BUG?!
            this.AutoScaleBaseSize = new System.Drawing.Size(614);
WSE2.0的BUG?!            
this.ClientSize = new System.Drawing.Size(456325);            
WSE2.0的BUG?!            
this.Controls.Add(this.button1);
WSE2.0的BUG?!            
this.Name = "Form1";
WSE2.0的BUG?!            
this.Text = "Form1";
WSE2.0的BUG?!            
this.ResumeLayout(false);
WSE2.0的BUG?!
WSE2.0的BUG?!        }

WSE2.0的BUG?!        
#endregion
WSE2.0的BUG?!

WSE2.0的BUG?!        
/// 应用程序的主入口点。
WSE2.0的BUG?!        
/// </summary>
WSE2.0的BUG?!        [STAThread]
WSE2.0的BUG?!        
static void Main() 
{
WSE2.0的BUG?!            Application.Run(
new Form1());
WSE2.0的BUG?!        }

WSE2.0的BUG?!
WSE2.0的BUG?!        
private void button1_Click(object sender, System.EventArgs e)
{
WSE2.0的BUG?!            UsernameToken token
=new UsernameToken("username","password1",PasswordOption.SendPlainText);
WSE2.0的BUG?!            
try
{
WSE2.0的BUG?!                localhost.SumServiceWse serviceProxy
=new localhost.SumServiceWse();
WSE2.0的BUG?!                SoapContext requestContext
=serviceProxy.RequestSoapContext;
WSE2.0的BUG?!                requestContext.Security.Timestamp.TtlInSeconds
=60;
WSE2.0的BUG?!                requestContext.Security.Tokens.Add(token);
WSE2.0的BUG?!                
WSE2.0的BUG?!                requestContext.Security.Elements.Add(
new MessageSignature(token));
WSE2.0的BUG?!                
WSE2.0的BUG?!                
int sum=serviceProxy.IntAdd(3,5);
WSE2.0的BUG?!                MessageBox.Show(sum.ToString());
WSE2.0的BUG?!
WSE2.0的BUG?!            }

WSE2.0的BUG?!            
catch (System.Web.Services.Protocols.SoapException se) 
{
WSE2.0的BUG?!                MessageBox.Show(se.ToString());
WSE2.0的BUG?!            }

WSE2.0的BUG?!            
catch (Exception ex) 
{
WSE2.0的BUG?!                MessageBox.Show(ex.ToString());
WSE2.0的BUG?!                
return;
WSE2.0的BUG?!            }

WSE2.0的BUG?!        
WSE2.0的BUG?!        }

WSE2.0的BUG?!
WSE2.0的BUG?!    
WSE2.0的BUG?!        }

WSE2.0的BUG?!    }

WSE2.0的BUG?!
WSE2.0的BUG?!
WSE2.0的BUG?!

5、JAVA的客户端代码,使用axis-wsse(可从http://sourceforge.net/projects/axis-wsse/得到)
WSE2.0的BUG?!/*
WSE2.0的BUG?! * Created on 2005-2-26
WSE2.0的BUG?! *
WSE2.0的BUG?! * TODO To change the template for this generated file go to
WSE2.0的BUG?! * Window - Preferences - Java - Code Style - Code Templates
WSE2.0的BUG?! 
*/
WSE2.0的BUG?!package WSEClient;
WSE2.0的BUG?!
WSE2.0的BUG?!import net.vitale.filippo.axis.handlers.
*;
WSE2.0的BUG?!import org.apache.axis.client.
*;
WSE2.0的BUG?!import javax.xml.namespace.
*;
WSE2.0的BUG?!
WSE2.0的BUG?!
/**
WSE2.0的BUG?! * @author Jeet
WSE2.0的BUG?! *
WSE2.0的BUG?! * TODO To change the template for this generated type comment go to
WSE2.0的BUG?! * Window - Preferences - Java - Code Style - Code Templates
WSE2.0的BUG?! 
*/
WSE2.0的BUG?!public class TestService
WSE2.0的BUG?!{
WSE2.0的BUG?!
WSE2.0的BUG?!    static String usernameS 
= null
WSE2.0的BUG?!    static String passwordS 
= null
WSE2.0的BUG?!
WSE2.0的BUG?!    public static 
void main(String[] args)
WSE2.0的BUG?!    {
WSE2.0的BUG?!        
try { 
WSE2.0的BUG?!            Integer i 
= new Integer(5); 
WSE2.0的BUG?!            Integer j 
= new Integer(2); 
WSE2.0的BUG?!            String endpoint
="http://localhost/WebTest/SumService.asmx"
WSE2.0的BUG?!            Service service 
= new Service(); 
WSE2.0的BUG?!            Call call 
= (Call)service.createCall(); 
WSE2.0的BUG?!            call.setTargetEndpointAddress(
new java.net.URL(endpoint)); 
WSE2.0的BUG?!            call.setOperationName(
new QName("http://www.gds-china.com/SU","IntAdd")); 
WSE2.0的BUG?!            call.addParameter(
"a",org.apache.axis.encoding.XMLType.XSD_DATE,javax.xml.rpc.ParameterMode.IN); 
WSE2.0的BUG?!            call.addParameter(
"b",org.apache.axis.encoding.XMLType.XSD_DATE,javax.xml.rpc.ParameterMode.IN); 
WSE2.0的BUG?!            call.setReturnType(org.apache.axis.encoding.XMLType.XSD_INT); 
WSE2.0的BUG?!
//            call.setReturnType(org.apache.axis.encoding.XMLType.XSD_STRING);
WSE2.0的BUG?!
            call.setUseSOAPAction(true); 
WSE2.0的BUG?!            call.setSOAPActionURI(
"http://www.gds-china.com/Rpc"); 
WSE2.0的BUG?!            
//add a user token 
WSE2.0的BUG?!
            usernameS="1234";
WSE2.0的BUG?!            passwordS 
= "password"
WSE2.0的BUG?!            call.setUsername(usernameS); 
WSE2.0的BUG?!            call.setPassword(passwordS); 
WSE2.0的BUG?!    
WSE2.0的BUG?!            call.setProperty(WsseClientHandler.PASSWORD_OPTION, WsseClientHandler.PASSWORD_DIGEST_WITH_NONCE); 
WSE2.0的BUG?!            call.setClientHandlers(
new WsseClientHandler(), null); 
WSE2.0的BUG?!            Integer k 
= (Integer)call.invoke(new Object[]{i,j}); 
WSE2.0的BUG?!            System.out.println( 
"result is " + k.toString() + "."); 
WSE2.0的BUG?!
//            Vector inputs = new Vector();
WSE2.0的BUG?!//
            String s=(String)call.invoke(inputs.toArray());
WSE2.0的BUG?!//
            System.out.println("result is "+s+ ".");
WSE2.0的BUG?!
                  
WSE2.0的BUG?!           } 
WSE2.0的BUG?!           
catch (org.apache.axis.AxisFault e) 
WSE2.0的BUG?!           { 
WSE2.0的BUG?!            
if (e.getFaultCode().toString() .equals("{http://schemas.xmlsoap.org/ws/2002/07/secext}FailedAuthentication")) 
WSE2.0的BUG?!             System.err.println(
"The usernameToken and password aren't right! "); 
WSE2.0的BUG?!            
else { 
WSE2.0的BUG?!                   System.err.println(e.getFaultCode().toString()); 
WSE2.0的BUG?!            } 
WSE2.0的BUG?!           } 
WSE2.0的BUG?!           
catch(Exception e) 
WSE2.0的BUG?!           { 
WSE2.0的BUG?!            System.err.println(e.toString()) ; 
WSE2.0的BUG?!           } 
WSE2.0的BUG?!          } 
WSE2.0的BUG?!      } 
WSE2.0的BUG?!
WSE2.0的BUG?!
WSE2.0的BUG?!

相关文章:

  • 2021-07-07
  • 2021-10-18
  • 2021-07-30
  • 2021-06-30
  • 2021-12-18
  • 2021-08-25
  • 2021-09-06
  • 2021-04-15
猜你喜欢
  • 2022-12-23
  • 2022-01-11
  • 2022-12-23
  • 2021-11-21
  • 2022-01-14
  • 2021-09-28
相关资源
相似解决方案