我们在项目实战中经常会有需要共享TCSession的需求,举个简单的例子,比如我们要做个CAD集成Teamcenter登录后,CAD端还需要登录吗?一般我们是采用CAD插件开发的形式用通过S0A与Teamcenter进行交互,如果CAD端还需要再登录一次那密码呢?难道让客户输入两次密码登录两次吗?甲方爸爸估计不会同意,有个同学会说,获取用户的账号不难,我们修改一下Teamcener登录界面,在用户登陆时把密码偷偷记录下来,那被客户知道了估计也是要K你的,还有一个办法,就是我们可以采用前面课程中讲的万能密码的方式啊(如有兴趣请打开链接)。但是这样也是有问题的,首先大家都知道Teamcenter登录是很慢的,客户体验不太好,这个问题不大,忽悠-下客户就行了,大的问题是登录两次需要多占用一个License,license可是很贵的,当用户很多的时候就需要支持很大的一笔费用了,那这个问题有解决方法吗?有!今天我们就来讲解一下SOA开发的程序如何共享已经打开的Teamcenter的会话,免登录、免License。
其实原理很简单,4层Teamceter胖客户端也是采用S0A的方式与服务器交互的,归根结底也是Http的连接,如果CAD端的插件使用与4层胖客户端一样的Cookie去与Teamcenter服务器交互,Teamcenter服务器是不知道的,那具体怎么实现呢?
首先,我们需要在4层胖客户端上做个插件,获取当前连接的Cookie
Connection connect=session.getSoaconnection():Cookie[lck=connect.getceekies();for(int i=0;i<ck.length;i++)
string HostPath=connect.getHostPath();String cookie=HostPath+"\n"+ckli].tostrin
其次,需要将这个cookie传递给CAD端,一般写到本地的临时文件就行了
在CAD端将前面获取的Cookie还原成Teamcenter的connection对象,这个是难点最后,
connection connection = new Connection(serverHost, new system,Net,Cookiecollection(), credentialMgr, SoaConstants.REST,Teamcenter,(lienty.Session,connection e connectionconnection.ExceptionHandler = new Teamcenter.clientX,AppXExceptionHandler();connection.ModelManager.AddPartialErrorlistener(new Teancenter.clientX.AppXPartialErrorlistener());connection,ModelManager,AddModelEventlistener(new Teamcenter,Clientx,AppXModelEventlistener());Connection.AddReguestListener(now Teamcenter.CliontX.AppXRequestlistener());SessionService sessionservice: SessionService,netService(connection);try
Cookie ck = neu Cookie();ck.Domain : GetDomainFormURL(serverHost);ck.Path ="/;ck.Nane = "ISESSIONID";ck.Value = CookieValueconnection.Cookies.Add(ck);Teancenter,Soa,Client,Model,Strong,User user"sessionService,GetTcSessionInfo().User;DataManagementService dnService = DataManagementService.getService(connection);
LoadAttribute(dnService, user, "user id");string id = user.User id;Console.writeLine("Login successfully! );
catch(Exception e)