本文通知原文章不再更新维护,并指引读者到新文章查看接口说明。文中详细介绍了如何根据端口类型(实例端口或群集端口)配置EAS的安全模式和高可用WebService方案。包括修改配置文件启用安全模式、调用WebService时传递SessionID以保持会话、以及Java和C#等不同语言的具体实现方法。还提供了登录接口的参数说明和常见问题解决方案。
由于运营调整,本文章不再更新维护,具体的接口说明请移步新文章
https://vip.kingdee.com/article/173164492883473920
请确认调用方用的端口是eas的具体实例端口还是群集端口,实例端口参照“安全模式”方案实施,群集端口一定要用“高可用webservice方案技术方案(连接集群端口)”方案。
由于网页排版问题,如果不全,详细信息请下载附件中文档查看 。
一,安全模式(只适用实例端口)注意:85版本以后实例端口不能是实例1
1)、启用安全模式。修改eas\Server\eas\server\profiles\server1~N\config\webservice.propetties文件,另起一行,添加参数如下:
isRomoteLocate=false (注意参数名和值不要写错,可直接复制过去)
是否启用成功测试方法(群集端口同用):
客户端set-url.bat 端口连接设置成与webserivce调用对应的实例或集群的端口一致,然后在查询分析器分步执行服务端脚本: com.kingdee.bos.webservice.WSConfig.init() --调用webservice.properties方法初始配置 com.kingdee.bos.webservice.WSConfig.getRomoteLocate() --获取安全模式设置参数,返回result:false就是成功启用了安全模式。否则失败,请检查安全模式的配置文件。
2)、修改参数后,webservice调用端需要把登录返回的session传过去,java调用示例如下,其它语言调用参考EASLoginProxy proxy =null;
WSContext context = null;
//登录
proxy = new EASLoginProxyServiceLocator().getEASLogin();
context= proxy.login("kdjgf", "", "eas", "zs70sp5", "l2", 1);
if(context. getSessionId() == null ){
throw new Exception(“login fail”);
}
//具体业务调用
String[][] vouchers= null;
WSGLWebServiceFacadeSrvProxy proxyWS= null;
proxyWS = new WSGLWebServiceFacadeSrvProxyServiceLocator().getWSGLWebServiceFacade();
//设置登录返回的session在soap头 "http://login.webservice.bos.kingdee.com"是固定的
((Stub) proxyWS).setHeader("http://login.webservice.bos.kingdee.com","SessionId", context.getSessionId());
其本质是,每次WEBSERVICE 访问,必须带上相关的 SessionID 信息,如下红字部分。系统将根据 SOAP头中的SessionID 信息,获取相关的上下文信息。
补充,donet/C#调用方式,需要部署私包sp_SOAPHead_forDoNet_V15.jar(文末附件提供),部署路径:server/lib/sp
[table]
[tr][td=641]1). 生成代理类,代理类中加入头信息变量定义public KDSessionId SessionId;//头信息要与接口中的相对应
2). 代理类中在需要调用的方法上加上参数[SoapHeader("SessionId")] //与类中定义的头同名
3). 定义头信息类 // // 头信息,需要与接口定义的头同名 // public class KDSessionId: SoapHeader { public string SessionId;//变量名与接口定义同名 }4). 调用 WSGLWebServiceFacadeSrvProxyService webuser= new WSGLWebServiceFacadeSrvProxyService(); webuser.SessionId = new KDSessionId() {SessionId = wscontext.sessionId }; webuser.deleteVoucher("03.02","2016.01", "1", "1");
二,高可用webservice方案技术方案(适用集群端口和实例端口)
1. 启用安全模式。修改eas\Server\eas\server\profiles\server1~N\config\webservice.propetties文件,另起一行,添加参数如下:
isRomoteLocate=false (注意参数名和值不要写错,可直接复制过去)
2. 在服务端server-config.wsdd(路径:eas/server/deploy/eas.ear/web.war/WEB-INF)的全局参数部分,添加scope的范围: 保证服务端返回设置jsessionid的cookie。如果缓存更新不及时,手动删除web的缓存目录/apusic/domains/server(1~N)/deploy/EAS/tmpfiles。
3,(java) 在webservice客户端调用处设置call.setMaintainSession(true); 保证axis自动携带cookie到服务端 注意,调用业务方法的时候使用登录接口时的同个call实例,不要新建。
例如:[code]//调用登陆接口
Service s=new Service();
Call call=(Call)s.createCall();
call.setOperationName("login");
call.setTargetEndpointAddress("http://localhost:8080/ormrpc/services/EASLogin?wsdl");
call.setReturnType(new QName("urn:client","WSContext"));
call.setReturnClass(WSContext.class);
call.setReturnQName(new QName("","loginReturn"));
//超时
call.setTimeout(Integer.valueOf(1000*600000*60));
call.setMaintainSession(true);
//登陆接口参数
WSContext rs=(WSContext)call.invoke(new Object[]{"am", "", "eas", "bos80demo", "l2", Integer.valueOf(0)});
if(rs. getSessionId() == null){
throw new Exception(“login fail”);
}
System.out.println(rs.getSessionId());
//清理
call.clearOperation();
//调用业务接口
call.setOperationName("addTest");
call.setTargetEndpointAddress("http://localhost:8080/ormrpc/services/WStettreeFacade");
//call.setReturnType(new QName("urn:lang.java","String"));
//call.setReturnClass(String.class);
call.setReturnQName(new QName("","addTestReturn"));
call.setTimeout(Integer.valueOf(1000*600000*60));
call.setMaintainSession(true);
//设置登录返回的session在soap头 "http://login.webservice.bos.kingdee.com"是固定的
SOAPHeaderElement header=new SOAPHeaderElement("http://login.webservice.bos.kingdee.com","SessionId", rs.getSessionId());
call.addHeader(header);
//接口参数
String aa=(String)call.invoke(new Object[]{"test1", "test"} );
[/code]
Call方式里ReturnQName ReturnClass等参数设置可以从实例端口方式发布生成的代理类Stub里抄。详见附件中登录接口说明文档
(C#)1. 设置System.Net.ServicePointManager.Expect100Continue = false;
2. 在登录接口和业务接口代理类的CookieContainner设置成同一个。
如此会正常设置jsessionid,而ngnix,f5等负载均衡通过jsessionid做会话粘帖,可满足高可用方案。通过EAS的nap做负载均衡方案,通过nap自己设置的NAPRoutIDcookie做负载均衡转发,只需设置第二步即可。[table]
[tr][td=568] 其他语言同理,保证2次请求的请求头Cookie里的JSESSIONID EASSESSIONID和NAPRoutID一致就能实现会话粘贴
三,接口参数说明
1. login(String userName, String password, String slnName,String dcName, String language, int dbType, String authPattern,int isEncodePwd)[code]userName 用户名 ,
password 密码 ,
slnName 解决方案名称 默认为eas,
dcName 数据中心id 可在管理控制台的数据中心界面查询(数据中心代码),
language 语言 (l1,l2,l3),
dbType 数据库类型(MS SQL Server:0,DB2 UDB:1,Oracle:2,MS SQL Server:3),
authPattern 验证方式 默认 "BaseDB" ; 其他认证方式KEY可从easAuthPatterns.xml中获取 ,
isEncodePwd 密码是否加密方式传递,0未加密,1加密[/code]
2.login(String userName, String password, String slnName,String dcName, String language, int dbType, String authPattern)
[code]isEncodePwd 默认为0,不加密方式[/code]
3.login(String userName, String password, String slnName,String dcName, String language, int dbType)
[code]authPattern验证方式 默认 "BaseDB" ,isEncodePwd 默认为0,不加密方式[/code]
四,https详见附件:EAS登录接口说明文档(WebService).docx
四,常见问题:
RMIException为服务器开启了安全模式,但调用方没处理好。根据上面的说明调整调用方就可以了。
EAS登录接口说明文档(WebService).docx(326.81KB)
sp_SOAPHead_forDoNet_V15.zip(10.42KB)
推荐阅读