二.配置.net的客户端
首先,作为测试就建立了一个C#的Windows Application,然后在默认的form上面加了一个button作为激发调用服务端的事件控制载体。用.net来调用web service通常情况使用增加一个web reference来注入这个远程服务,不过这边要特别特别强调,如果你要使用WSSE的话,不要急于先建立一个Web Reference,首先要将你的安全策略配置好,然后再建立web reference,不然自己手动的要去修改后台客户端代码。那么接着来说说.net的WSE。
.net提供的WSE(Web Services Enhancements)是用来增强对于Web Service的支持配置(包括了WS-Security等规范)。当前.net的WSE最新版本是3.0的,可以很方便的集成到VS2005中,而它的2.0版本主要是针对过去的VS2003版本,不过两者都是可以用的,但是在配置上面有一些差异,同时使用的方便程度也有些差距,2.0使用起来相对3要复杂一些。不过我们这里介绍的都是通过设置WS-Policy来应用WS-Security,这样比较方便,同时代码简洁,业务逻辑和具体的WS配置分开,是一种较好的使用模式,.net也支持代码内嵌WS-Security逻辑来实现WS-Security的使用。
我先来说一下3如何使用。安装好3以后,可以在我们的项目右键菜单中最下面看到WSE 3.0 setting,直接选择这项,弹出类似的设置页,第一页最顶上的一项选中。
然后选择Policy Tab页面设置,首先选中Enable Policy,然后选择Add,输入一个Policy的名称,后面就是一个向导配置页面,第一页的选择如下图
后面第一个要选择的x.509证书是本地的密码对存在的证书,也就是用来签名并向服务端发起请求的证书所在位置,选择了LocalMachine,然后再选择证书,也就是上面我导入到系统中的myisvdemo证书。然后出现如下图
将配置修改成图中所示,首先不要选择支持1.1扩展,因为.net和java对1.1扩展的支持实现有所差异,特别是签名回执上,连域名都不一致,所以使用起来有问题。然后我们现在只是要用sign-only的功能,因此就选择这项。
下一页是选择服务端响应时使用什么证书作为解析的证书,这里就选择local Machine的alisoft证书。至此Policy全部配置完成,关闭配置文件。在我们的工程里面会新增加一些文件,如下图所示:
其中在references中的是引入的第三方包,主要是为了将普通的web Service的代理类转变成为支持WSSE的代理类(这也是为什么我说不要先急着建立web reference的缘故,如果先建立web reference的话),打开Reference.map中的reference.cs文件,可以看到服务代理类是继承System.Web.Services.Protocols.SoapHttpClientProtocol,而如果在配置好策略以后服务代理类就会自动继承 Microsoft.Web.Services3.WebServicesClientProtocol,此时的服务代理类才可以支持WSSE的功能,因此如果先建立reference就要手动的去修改这些客户端文件。
然后打开wse3policyCache.config文件,这个文件就是刚才配置的Policy文件,修改establishSecurityContext=”false”,这个参数如果为true的话,会连续两次发送请求,后一次的请求内将不带有Policy中配置的信息(这个具体的我还不是很清楚,只是看到一个国外的人询问微软工程师的时候,认为这个是个缺陷,但是微软工程师则认为这是一个让用户集成自己配置的扩展点,不过个人认为,所谓扩展点应该是在默认没有扩展的时候不影响原有的配置)。第二需要在我们的axis2中除了配置signature还需要配置timestamp,默认每一次请求.net都会自动将timestamp作为action执行。
打开app.config文件,这里面指定了web service的policy配置文件,这里没有什么需要修改的,只需要按照他生成的内容即可。然后建立好web Reference,这个十分简单,就是输入wsdl的URI,然后填入服务的名称即可。最后一部就是写测试代码,重新打开Form1.cs,在button的onclick事件中写入下面的测试代码:
private void button1_Click(object sender, EventArgs e)
{
// AccountServiceWse是你的客户段代理类,有WSSE的增强功能,参看reference.cs文件
AccountServiceWse service = new AccountServiceWse();
//这个客户端代理类需要指定刚才配置的策略名称
service.SetPolicy(“clientPolicy”);
//简单的测试代码
accountService.ArrayOfAccountBean result = service.getUserAccountArr(“test”);
}
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
TechTarget
官方微博
TechTarget中国
相关推荐
-
内存数据网格提供商一头扎进Java
10年的时间里,应用性能解决方案提供商Alachisoft一直在用NCache(针对N-Tier和网格计算.NET应用的内存计算和数据网格产品)为.NET社区服务。
-
遇到这样一个问题:通过java service wrapper部署应用,wrapper进程占用的内存会一直升高, 直到把内存吃完应用崩溃,但是这个wrapper
遇到这样一个问题:通过java service wrapper部署应用,wrapper进程占用的内存会一直升高 […]
-
Google App Engine for Java 对于目前中国需要学习吗?
-
前无古人后无来者的Java平台
开发人员一直在致力于保持Java的活力,经过20年后,我们感觉从来没有更好的、更令人激动的时刻如同Java社区一样。