WebService:Java client + .NET WSE 2.0 相关问题解决方案

     最近在做为其他单位提供的数据服务的工作,因为不同单位的客户端都不一样,所以考虑到了以WebService的方式来提供数据接口。为了提高安全性,我们采用WSE安全认证方案。但受到服务器客观环境的限制,所以只能使用.net framework 1.1+wse2.0 sp3来做(建议服务端安装一些截包工具或学会打开输入输出及反馈的细节信息,这样便于调试和找到问题)。这里为什么是wse2.0后面会做描述。在客户端方面,我们模拟了C#客户端和Java客户端,并针对遇到的一些问题找到了一些解决方案,这里分享一下。

        1.使用wse1.0,java客户端调用时,提示SOAP头信息不正确

如果.net服务端采用了wse1.0,而且采用UsernameToken来验证时,当Java客户端也传递UsernameToke信息给服务端时,会提示“SOAP Header 不正确”的错误,但是.net 客户端没有任何问题,这就是为什么要使用WSE 2.0以上版本。

2.使用WSE2.0,java客户端调用时,提示“缺少Nonce和Created”节点

这种问题是因为java传递过去的SOAP信息不完整或无法让.NET服务端识别。解决的办法一是要么让服务端在传递过来SOAP信息中添加两个WSE节点,如:

//添加Nonce节点
XmlNode node1 = doc.CreateNode(XmlNodeType.Element,"wsse:Nonce","http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd");	
node1.Prefix = "wsse" ;
node1.InnerText = Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(System.DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ss.fffZ"))) ;
//添加Created节点
XmlNode node2 = doc.CreateNode(XmlNodeType.Element,"wsu:Created","http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd");	
node2.Prefix = "wsu" ;
node2.InnerText = DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ss.fffZ");

至于在什么位置添加这些信息,通过微软的帮助文件找到了UsernameTokenManager的LoadTokenFromXml方法,在这里可以自定义SOAP信息。

二是让JAVA客户端修正传递的SOAP信息


3.其他错误

根据“详细”的“错误信息”和基本原理 去查找或自我改进

我在做的过程中,遇到过很多问题,但是解决方案却很少,大部分都是老外的,而且也没有answer,总是根据一部分信息找来找去花了很多时间。总结起来,就是太过马虎,没有仔细看错误信息或去思考它的相关原理,而只是一味的依赖于去网上查找资料,结果都不如意。最后还是耐下心来查看帮助和思考它的工作机制时才发现原来可以这样做。

因为懒惰耽搁了好久才写,有些东西都忘了,所以写的简单,自我检讨。姑且先记录下来

posted on 2010-08-26 16:57  贾罗德  阅读(675)  评论(0编辑  收藏  举报

导航