关于C# 调用SHR Webservice的说明原创
金蝶云社区-阿星
阿星
74人赞赏了该文章 289次浏览 未经作者许可,禁止转载编辑于2024年08月02日 16:10:51

最近接到要开发星空单点登录到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#的调用代码中也需要声明公共容器,两个服务使用同一个容器,至此代码即可正常运行,以下是相关截图。

类型错误截图:

image.png

返回地址服务改造截图:

image.png

image.png

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; }

        }

    }

}


赞 74