• C#开发XML WebService接口(SOAP)


      using System;
    using System.Collections;
    using System.ComponentModel;
    using System.Data;
    using System.Diagnostics;
    using System.Web;
    using System.Web.Services;
    using BX.Interface;

    namespace WebService
    {
       
    /// <summary>
        
    /// Service1 的摘要说明。
        
    /// </summary> 

        public class doService : System.Web.Services.WebService
        
    {

    /// <summary>
            
    /// 网上报销系统WebService服务通用调用方法
            
    /// </summary>
            
    /// <param name="ifCode">接口标识</param>
            
    /// <param name="ifPass">校验码</param>
            
    /// <param name="ifEvent">操作方式(可空)</param>
            
    /// <param name="ifInfo">传入的XML信息</param>
            
    /// <returns></returns> 

            [WebMethod]
            
    public string IfService(string ifCode,string ifPass,string ifEvent,string ifInfo)
            
    {
                ifCode 
    = ifCode.Trim();
                ifPass 
    = ifPass.Trim();
                ifEvent 
    = ifEvent.Trim();
                ifInfo 
    = ifInfo.Trim();

                
    string IReceiveContract_Id = System.Configuration.ConfigurationSettings.AppSettings["IReceiveContract_Id"].Trim();
                
    string IReceiveContract_PSW = System.Configuration.ConfigurationSettings.AppSettings["IReceiveContract_PSW"].Trim();
                
    string IReceiveNoContract_Id = System.Configuration.ConfigurationSettings.AppSettings["IReceiveNoContract_Id"].Trim();
                
    string IReceiveNoContract_PSW = System.Configuration.ConfigurationSettings.AppSettings["IReceiveNoContract_PSW"].Trim();

                
    if(ifCode.Equals(IReceiveContract_Id))
                
    {
                    
    if(!ifPass.Equals(IReceiveContract_PSW))
                        
    return ICommon.createResultXML(2,"","");
                    
    return IApplyContract.ReceiveApply(ifCode,ifInfo);
                }

                
    else if(ifCode.Equals(IReceiveNoContract_Id))
                
    {
                    
    if(!ifPass.Equals(IReceiveNoContract_PSW))
                        
    return ICommon.createResultXML(2,"","");
                    
    return IApplyNoContract.ReceiveApply(ifCode,ifInfo);
                }

                
    else
                
    {            
                    
    return ICommon.createResultXML(1,"","");                    
                }
            
            }
     //-- end IfSerive
        }

    }

     


    // ****************************************************
    //    功    能:SOAP XML WebService接口通用处理类
    //    说    明:
    //    创 建 者:dingzh@jstrd.com
    //    创建时间:2007-07-04
    //    修改信息:
    // ****************************************************
    using System;
    using System.Xml;
    using System.Web.Services.Description;
    using System.CodeDom;
    using System.CodeDom.Compiler;
    using System.Data;

    namespace BX.Interface
    {
        
    /// <summary>
        
    /// SOAP XML WebService接口通用处理类
        
    /// </summary> 

        public class ICommon
        
    {
            
    public ICommon()
            
    {
                
    //
                
    // TODO: 在此处添加构造函数逻辑
                
    //
            }
            
                
            
    /// <summary>
            
    /// 动态引用一个XML Web Service        
            
    /// IfSerive(string ifCode,string ifPass,string ifEvent,string ifInfo)
            
    /// </summary>
            
    /// <param name="v_WSDL">WSDL路径</param>
            
    /// <param name="SvClsName">接口服务真实类名</param>
            
    /// <param name="v_WebMethod">接口函数方法名</param>
            
    /// <param name="v_ifCode">接口标识</param>
            
    /// <param name="v_args">接口函数参数列表数组</param>
            
    /// <returns>string</returns> 

            public static string getSoapService(string v_WSDL, string SvClsName, string v_WebMethod, string v_ifCode,ref object[] v_args)//不需安装SOAP ToolKit 3.0 !   
            {   
                
    string v_NameSpace = "DSv_"+v_ifCode;
                
    string v_ClassName = v_NameSpace + "." + SvClsName;

                
    //1)用XML阅读器从一个文件路径或者是网络路径中读入WSDL文件:   
                XmlTextReader reader = new XmlTextReader(v_WSDL);//加入 using System.Xml;   
                
    //2〉把读到的内容用ServiceDescription来描述:   
                ServiceDescription sd = ServiceDescription.Read(reader);   //加入using System.Web.Services.Description;   
                
    //3)用服务导入器把得到的描述导入服务描述中:   
                ServiceDescriptionImporter sdi = new ServiceDescriptionImporter();   
                sdi.AddServiceDescription(sd,
    null,null);   
                
    //4)指定要动态编译的代码的命名空间:   
                CodeNamespace cn = new CodeNamespace(v_NameSpace);   //"DynamicServices"
                
    //5)指定要动态编译的代码单元:   
                CodeCompileUnit ccu = new CodeCompileUnit();   
                
    //6)把命名空间添加到动态编译的代码单元的命名空间组中去:   
                ccu.Namespaces.Add(cn);   
                
    //7)指示服务导入器把该动态编译单元内该命名空间的代码导进去,作为新的动态服务描述:   
                sdi.Import(cn,ccu);   
                
    //8)新建一个C#编译器来编译:   
                ICodeCompiler icc = new Microsoft.CSharp.CSharpCodeProvider().CreateCompiler();  
                
    //9)新建一个编译参数对象(在这里我们设置它为空的编译参数):   
                CompilerParameters cp=new CompilerParameters();    
                
    //10)指示C#编译器,按照 CP 编译参数对象提供的参数来进行 CCU 单元的编译。并把编译结果传给 编译结果对象 cr:   
                CompilerResults cr = icc.CompileAssemblyFromDom(cp, ccu);   
                
    //11)从动态编译结果中获取 某个 字符串(通常是该类型名字)所表示的真实类:   
                Type t = cr.CompiledAssembly.GetType(v_ClassName);   //其中的DynamicServices必须和CodeNamespace cn = new   CodeNamespace("DynamicServices");定义的同名  
                
    //12)创建该类的实例:   
                Object obj = Activator.CreateInstance(t);           
                
    //13)根据方法名称字符串 反射到该方法的实体:   
                System.Reflection.MethodInfo mi = obj.GetType().GetMethod(v_WebMethod);              
                
    //14)用该方法实体的.Invoke()来调用该方法:   
                string ret = System.Convert.ToString(mi.Invoke(obj, v_args));  //,new object[]{"传给方法的参数1","传给方法的参数2"}));    
                return ret;
                
                
    //            添加Web 引用,在WSDL一栏中把刚才得到的WSDL地址复制过来,Web 引用的名称输入JavaService
                
    //            JavaService.ServiceService bean = new JavaService.ServiceService();
                
    //            string aa = bean.IfService("ifUser","ifPass","ifCode","ifEvent","info");
            }
      //-- End getSoapService/



            
    /// <summary>
            
    /// 创建返回结果XML
            
    /// </summary>
            
    /// <param name="v_ifResult">接口结果代码</param>
            
    /// <param name="v_ifStack">错误信息堆栈</param>
            
    /// <param name="v_ifResultInfo">接口结果信息</param>
            
    /// <returns>string</returns>         

            public static string createResultXML(int v_ifResult,string v_ifErrStack,string v_ifResultInfo)
            
    {
                
    string v_ifError = "";
                
    switch(v_ifResult)
                
    {
                    
    case 1:
                        v_ifError 
    = "无此接口标识ifCode";
                        
    break;
                    
    case 2:
                        v_ifError 
    = "调用系统校验未通过";
                        
    break;
                    
    case 3:
                        v_ifError 
    = "传入的不是一个正确的xml格式";
                        
    break;
                    
    case 4:
                        v_ifError 
    = "info参数中的字段不符合规约中的要求";
                        
    break;
                    
    case 5:
                        v_ifError 
    = "该条数据已重复发送";
                        
    break;
                    
    case 9:
                        v_ifError 
    = "本系统处理时发生异常";
                        
    break;
                    
    default:
                        
    break;
                }


                XmlDocument xmldoc;
                
    //XmlNode xmlnode;
                XmlElement xmlelem;

                xmldoc 
    = new XmlDocument();
                
    //加入XML的声明段落,<?xml version="1.0" encoding="gb2312"?>
                XmlDeclaration xmldecl;
                xmldecl 
    = xmldoc.CreateXmlDeclaration("1.0","gb2312",null);
                xmldoc.AppendChild (xmldecl);

                
    //加入一个根元素
                xmlelem = xmldoc.CreateElement ("","IfResponse","");
                xmldoc.AppendChild (xmlelem) ;
                
    //加入另外一个元素
                
    //for(int i=1;i<3;i++)
                
    //{

                XmlNode root 
    = xmldoc.SelectSingleNode("IfResponse");//查找<IfResponse> 

                XmlElement eIfResult 
    = xmldoc.CreateElement("IfResult");//创建一个<IfResult>节点                 
                eIfResult.SetAttribute("Note","接口结果代码"); //设置该节点Note属性 
                eIfResult.InnerText = v_ifResult.ToString(); //设置节点文本值
                root.AppendChild(eIfResult);  //添加到<IfResponse>节点中 

                XmlElement eIfError 
    = xmldoc.CreateElement("IfError");        
                eIfError.SetAttribute(
    "Note","错误信息"); 
                eIfError.InnerText 
    = v_ifError;
                root.AppendChild(eIfError);  

                XmlElement eIfErrorStack 
    = xmldoc.CreateElement("IfErrorStack");            
                eIfErrorStack.SetAttribute(
    "Note","错误信息堆栈");
                eIfErrorStack.InnerText 
    = v_ifErrStack;
                root.AppendChild(eIfErrorStack);

                XmlElement eIfResultInfo 
    = xmldoc.CreateElement("IfResultInfo");                
                eIfResultInfo.SetAttribute(
    "Note","接口结果信息");
                eIfResultInfo.InnerText 
    = v_ifResultInfo;
                root.AppendChild(eIfResultInfo);
                
    //}
                
    //保存创建好的XML文档
                
    //xmldoc.Save ( Server.MapPath("data.xml") ) ; 

                
    return xmldoc.InnerXml;
                
    //xmldoc.OuterXml;

    //        <?xml version="1.0" encoding="GB2312"?>
    //        <IfResponse>
    //        <IfResult>接口结果代码</IfResult>
    //        <IfError>错误信息</IfError>
    //        <IfErrorStack>错误信息堆栈</IfErrorStack>
    //        <IfResultInfo>接口结果信息</IfResultInfo>
    //        </IfResponse>
    //
    //        <IfResult/>依照下述约定:
    //        成功:0 —仅表示接口调用成功,并不代表业务调用成功,业务返回结果信息存放于<IfResultInfo/>节点中
    //        失败:非零整数值    
    //            1:无此接口标识ifCode
    //            2:调用系统校验未通过    
    //            3:传入的不是一个正确的xml格式
    //            4:info参数中的字段不符合规约中的要求
    //            5:该条数据已重复发送
    //            9:本系统处理时发生异常
            }
     //-- End createResultXML/

            

            
    /// <summary>
            
    /// 将XML格式字符串转化成DataSet
            
    /// </summary>
            
    /// <param name="xml">xml字符串</param>
            
    /// <returns>DataSet</returns> 

            public static DataSet parseResultXML2DataSet(string xml)
            
    {
                DataSet ds 
    = new DataSet();    
            
                
    //方法一
                using(System.IO.StringReader sr = new System.IO.StringReader(xml))
                
    {            
                    ds.ReadXml(sr);
                }


    //            //方法二
    //            using(System.Xml.XmlReader xr = System.Xml.XmlReader.Create(new System.IO.StringReader(xml)))
    //            {
    //                ds.ReadXml(xr);
    //            }

    //            //方法三
    //            using(System.IO.Stream st = new System.IO.MemoryStream(System.Text.Encoding.UTF8.GetBytes(xml)))
    //            {
    //                ds.ReadXml(st);
    //            }

                
    return ds;
            }


            
    /// <summary>
            
    /// 将XML格式字符串转化成IStructResult
            
    /// </summary>
            
    /// <param name="xml">xml字符串</param>
            
    /// <returns>IStructResult</returns> 

            public static IStructResult parseResultXML2Struct(string xml)
            
    {
                IStructResult structResult 
    = new IStructResult();
                structResult.Clear();

                XmlDocument xmldoc 
    = new XmlDocument();
                
    try 
                
    {
                    xmldoc.LoadXml(xml);
                }
     
                
    catch(XmlException ex)
                
    {
                    structResult.IfResult 
    = -1;
                    structResult.IfError 
    = "未能处理的异常返回结果";
                    structResult.IfErrorStack 
    = ex.Message;
                    
    return structResult;
                    
    //throw ex;                        
                }

                
                
    try
                
    {
                    
    string strResult = xmldoc.GetElementsByTagName("IfResult").Item(0).InnerText.Trim();
                    structResult.IfResult        
    = strResult.Equals(string.Empty)?-1:int.Parse(strResult);
                    structResult.IfError        
    = xmldoc.GetElementsByTagName("IfError").Item(0).InnerText.Trim();
                    structResult.IfErrorStack    
    = xmldoc.GetElementsByTagName("IfErrorStack").Item(0).InnerText.Trim();
                    structResult.IfResultInfo    
    = xmldoc.GetElementsByTagName("IfResultInfo").Item(0).InnerText.Trim();
                }

                
    catch(Exception e)
                
    {
                    structResult.IfResult 
    = -1;
                    structResult.IfError 
    = "未能处理的异常返回结果";
                    structResult.IfErrorStack 
    = e.Message;
                    
    return structResult;
                    
    //throw e;                            
                }

                
    return structResult;
            }

        }



        
    /// <summary>
        
    /// 接口返回结果结构体
        
    /// </summary> 

        public struct IStructResult
        
    {
            
    public int        IfResult;
            
    public string    IfError;
            
    public string    IfErrorStack;
            
    public string    IfResultInfo;

            
    public void Clear()
            
    {
                IfResult        
    = -1;
                IfError            
    = "";
                IfErrorStack    
    = "";
                IfResultInfo    
    = "";
            }

        }

    }



    using System;
    using System.Xml;
    using System.IO;

    namespace BX.Interface
    {
        
    /// <summary>
        
    /// IApplyContract 的摘要说明。
        
    /// </summary> 

        public class IApplyContract
        
    {
            
    public IApplyContract()
            
    {
                
    //
                
    // TODO: 在此处添加构造函数逻辑
                
    //
            }
            

            
    /// <summary>
            
    /// 接收合同付款申请信息
            
    /// </summary>
            
    /// <param name="xml"></param>
            
    /// <returns></returns>

            public static string ReceiveApply(string interfaceid, string xml)
            
    {            
                XmlDocument xmldoc 
    = new XmlDocument();
                
    try 
                
    {
                    xmldoc.LoadXml(xml);
                }
     
                
    catch(XmlException ex)
                
    {
                    
    //throw ex;
                    return ICommon.createResultXML(3,ex.Message,"");                
                }


    try
                
    {
                    action 
    = xmldoc.GetElementsByTagName("action").Item(0).InnerText.Trim();
    .
    .
    //XML节点解析//
    .
    .
    }

                
    catch(Exception e)
                
    {
                    
    //throw e;
                    return ICommon.createResultXML(4,e.Message,"");                
                }
        

    string strSQL = "INSERT INTO dbo.bx_apply_interface () Values()";
    try
                
    {
                    
    //检测是否重复提交
                    string sqlJudge = "SELECT MAX(receive_time) AS lstTime FROM dbo.bx_apply_interface";
                    sqlJudge 
    += " WHERE prjid='"+contract_prjid+"' AND cttid='"+contract_cttid+"' AND expandid='"+contract_expandid+"'";
                    
    object objTime = BX.DAL.DBHelper.ExecuteScalar(sqlJudge);
                    
    if(objTime != DBNull.Value)
                    
    {
                        
    string lstTime = Convert.ToString(objTime).Trim();
                        
    if(!lstTime.Equals(string.Empty))
                            
    return ICommon.createResultXML(0,"该条数据已于"+lstTime+"成功传入网上报销系统!\n操作忽略!","0");
                            
    //return ICommon.createResultXML(5,"该条数据已于"+lstTime+"成功传入网上报销系统!\n不能重复提交!","1");
                    }


                    BX.DAL.DBHelper.ExecuteNonQuery(strSQL);
                }
     
                
    catch(System.Data.SqlClient.SqlException exSQL)
                
    {
                    
    //throw exSQL;
                    return ICommon.createResultXML(9,exSQL.Message,"1");                
                }


                
    return ICommon.createResultXML(0,"","0");
            }
            
        }

    }


    using System;
    using System.Xml;
    using System.Data;

    namespace BX.Interface
    {
        
    /// <summary>
        
    /// ISendAuditResult 的摘要说明。
        
    /// </summary>

        public class ISendAuditResult
        
    {

        
    /// <summary>
            
    /// 调用网上报销审批系统传递审批结果信息接口        
            
    /// </summary>
            
    /// <param name="info"></param>
            
    /// <returns>IStructResult</returns>

            public static string[] invoke(StructAuditResult v_struct)
            
    {
                
    string WSDL = System.Configuration.ConfigurationSettings.AppSettings["ISendAuditResult_WSDL"];
                
    string SvClsName = System.Configuration.ConfigurationSettings.AppSettings["ISendAuditResult_SvClsName"];
                
    string WebMethod = System.Configuration.ConfigurationSettings.AppSettings["ISendAuditResult_WebMethod"];
                
    string ifCode = System.Configuration.ConfigurationSettings.AppSettings["ISendAuditResult_ifCode"];
                
    string ifPass = System.Configuration.ConfigurationSettings.AppSettings["ISendAuditResult_ifPass"];            
                
    string ifEvent = System.Configuration.ConfigurationSettings.AppSettings["ISendAuditResult_ifEvent"];    
            
                
    string info = creatXML(v_struct);
    //            object[] args = new object[]{ifCode,ifPass,ifEvent,info};        
                
    //            return ICommon.parseResultXML2Struct(ICommon.getSoapService(WSDL, SvClsName, WebMethod, ifCode, args));

                
    //int GetPrjCttPayment(string ValPWD,string xmlContent,ref string ErrorInfo);            
                object[] args = new object[]{ifPass,info,""};
                
    int ret = int.Parse(ICommon.getSoapService(WSDL, SvClsName, WebMethod, ifCode,ref args));
                
                
    string[] resultInfo = new string[2];
                resultInfo[
    0= ret.ToString();
                resultInfo[
    1= Convert.ToString(args[2]).Trim();//返回错误信息
                return resultInfo;
            }


            
    private static string creatXML(StructAuditResult v_struct)
            
    return xmldoc.InnerXml;}

       }

    }

  • 相关阅读:
    1553: Good subsequence (很奇妙的set模拟题,也可以直接暴力)
    1550: Simple String (做得少的思维题,两个字符串能否组成另外一个字符串问题)
    1549: Navigition Problem (几何计算+模拟 细节较多)
    1548: Design road (思维题 做法:三分找极值)
    Python 正则表达式入门(初级篇)
    Python中的正则表达式教程
    软件自动化测试的学习步骤
    自动化测试的Selenium的python版安装与使用
    自动化测试一些问题
    自动化测试
  • 原文地址:https://www.cnblogs.com/fery/p/1790094.html
Copyright © 2020-2023  润新知