最近一直在忙热线的项目,主要的业务是接收其他单位的单子,然后在本系统进行审批处理,最后把处理的结果以XML的形式反馈回原单位。数据交互主要用WebService技术,其实是给两家同时做接口,其中一家用WSDL推送数据,一家用WebService推送数据,我们反馈数据统一用WebService技术,用WinService定时推送符合条件的数据。想把整个开发和调试过程记录下来,但是不知道如何描述,想到哪写到哪吧,以后有时间再修改完善。
第一次用VPN进行远程控制还是在上家公司,在IE浏览器中输入IP地址后要安装一个插件,还要把此IP地址加入兼容模式才能正常远程。这次用的是RealVNC(Virtual Network Computer)进行远程访问,RealVNC有客户端(vncviewer)和服务器端(vncserver),用vncviewer进行连接。注意:当长时间未操作远程桌面的时候,远程服务器会休眠,这时候鼠标无法操作,需要按F8进入菜单选项进行控制。
接口交互的步骤:
1、仔细阅读接口文档,根据文档说明准备数据。(必填字段、字段类型、标记位、状态标识等需注意)
2、他们通过调用我们提供的WebService地址,把数据以XML的形式发送过来,我们对一串XML格式的字符串进行解析保存进DataSet对象中,组织成一个DataTable对象,再把DataTable中的数据存入DTO实体对象中,最后通过StringBuilder拼接出一条长长的Insert语句,然后执行这条SQL语句把数据存入中间库。
public static DataSet XmlStringToDataSet(string xmlString) { xmlString = urnhtml(xmlString); if (!string.IsNullOrEmpty(xmlString)) { XmlTextReader Xmlrdr = null; StringReader StrStream = null; try { XmlDocument xmldoc = new XmlDocument(); xmldoc.LoadXml(xmlString); DataSet ds = new DataSet(); StrStream = new StringReader(xmldoc.InnerXml); Xmlrdr = new XmlTextReader(StrStream); ds.ReadXml(Xmlrdr); return ds; } catch(Exception ex) { WriterTextLog.WriterLog("SaveAcceptInfo", "将XMLSTR转换成DATASET时出错,错误:" + ex.Message, "Error"); return new DataSet(); } finally { //释放资源 if (Xmlrdr != null) { Xmlrdr.Close(); StrStream.Close(); StrStream.Dispose(); } } } else { return null; } }
private static AcceptInfo YWPDInfo(DataTable dt) { string param = "param_TEXT"; AcceptInfo info = new AcceptInfo(); DataRow[] dr = null; dr = dt.Select("name = 'SERIAL_NUMBER'"); if (dr.Length > 0) info.WPID = dr[0][param].ToString(); dr = dt.Select("name = 'EXECUTE_DEPT'"); if (dr.Length > 0) info.ACCEPTDEPARTMENT = dr[0][param].ToString(); dr = dt.Select("name = 'D_JIEBAOSJ'"); if (dr.Length > 0) info.DATE = DateTime.Parse(dr[0][param].ToString()); dr = dt.Select("name = 'S_DENGLUZD'"); if (dr.Length > 0) info.S_DENGLUZD = dr[0][param].ToString();
return info; }
StringBuilder sqlSb = new StringBuilder(); sqlSb.Append(" INSERT INTO Accept ("); sqlSb.Append(" WPID ,"); sqlSb.Append(" SERIALNUMBER ,"); sqlSb.Append(" DATE ,"); sqlSb.Append(" DATE1 ,"); sqlSb.Append(" ACCEPTDEPARTMENT ,"); sqlSb.Append(" S_LIANXIDH)"); sqlSb.Append(" VALUES"); sqlSb.Append(" ("); sqlSb.Append("'" + acceptInfo.WPID + "',"); sqlSb.Append("'" + acceptInfo.SERIALNUMBER + "',"); sqlSb.Append("'" + acceptInfo.DATE + "',"); sqlSb.Append("'" + acceptInfo.DATE1 + "',"); sqlSb.Append("'" + acceptInfo.ACCEPTDEPARTMENT + "',"); sqlSb.Append("'" + acceptInfo.S_LIANXIDH + "')"); string ConnStr = System.Configuration.ConfigurationManager.AppSettings["ConnString"]; int backValue = SqlHelper.ExecuteNonQuery(ConnStr, CommandType.Text, sqlSb.ToString());
3、信息审核程序从中间库中抓取数据放入正式库,同时对数据进行增删改查等操作,成功获取数据后要修改状态字段。
4、数据处理完成后,WinService服务是一直在运行的,当发现有符合条件的数据后就取出来放入DTO实体对象中,把DTO对象放入多行两列的DataTable中,再通过循环把每一行数据组织成XML格式,然后回发给原单位,成功发送数据后要修改状态字段。
在开发过程中遇到的问题:
1、有一家是用JAVA开发的,提供的是WSDL文件进行交互,我们需要把对应的WSDL生成C#可以识别的形式。在本地的话用VS自带的命令提示,通过敲命令就可以生成对应的.CS文件。但是如果服务器上没有安装VS的话,就要通过wsdl.exe程序进行生成。
2、在本地部署Winservice可以直接利用一个小程序可以自动安装,在服务器上没有framework环境,或者framework版本不合适的话,就只能用dos命令安装Winservice了。
3、调试WebService时,可以直接把项目设置为启动项,把某个服务文件设置为起始页,运行后在浏览器中输入XML字符串就可以调试了。
4、调试Winservice时有些麻烦,首先要把项目设置为启动项,然后在服务管理器中打开对应的服务,在VS调试中选择附加进程,找到服务双击即可调试。