最近接到要开发星空单点登录到SHR的需求,在编码的过程中遇到了一些问题,此处记录下,也提供下经验给各位参考。首先是收到了SHR开发同事的提供的两个Webservice服务,一个是登录,一个用于返回单点登录地址。我按照C#引用web服务正常操作,生成两个服务。在调用登录时,发生了WSContext类型错误的问题,最后发现更新插件后,即使写了HotUpdate,也需要重启iis才不会报错,跟踪后发现,重启iis后系统会在C盘新增我插件的一个副本,bin目录下的插件版本和这个副本不一致的话,就会报类型转换的错误。这个问题解决了之后,调用返回地址服务,又发生了【“com.kingdee.bos.webservice.WSInvokeException: com.kingdee.bos.orm.rmi.RMIException”】错误。这个错误是没有给返回地址服务传入获取的SessionId,这个问题的处理方式是,先改造生成的返回地址服务代码,添加SessionId变量,然后给对应服务中对应的方法添加[SoapHeader("SessionId")]标识,最后在C#的调用代码中,传入SessionId即可。C#的调用代码中也需要声明公共容器,两个服务使用同一个容器,至此代码即可正常运行,以下是相关截图。
类型错误截图:
返回地址服务改造截图:
C# 调用代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
using XC.CHJT.XJX.PlugIn.EASLogin;
using XC.CHJT.XJX.PlugIn.SHRService;
namespace XC.CHJT.XJX.PlugIn.Util
{
public class SHRServices
{
public static CookieContainer c = new CookieContainer();//定义Cookie容器
public static shr Login(string userName, string password, string slnName, string dcName, string language, int dbType)
{
System.Net.ServicePointManager.Expect100Continue = false;
shr _shr = new shr();
WSContext ctx = null;
EASLoginProxyService loginProxyService = new EASLoginProxyService();
loginProxyService.CookieContainer = c;
ctx = loginProxyService.login(userName, password, slnName, dcName, language, dbType) as WSContext;
if (ctx.sessionId != "")
{
_shr.seission = ctx.sessionId;
return _shr;
}
else
return null;
}
public static string GetUrl(string name, string phone,string sessionid)
{
try
{
WSSHRSSOFacadeSrvProxyService service = new WSSHRSSOFacadeSrvProxyService();
service.CookieContainer = c;
service.SessionId = new KDSessionId() { SessionId = sessionid };
string url = service.GetSsoUrl(name, phone);
return url;
}
catch (Exception ex)
{
return "";
throw;
}
}
public class shr
{
public string ResultString { get; set; }
public string seission { get; set; }
}
}
}
推荐阅读