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
????}
}
?
通用處理類ICommon.cs
//?****************************************************
//????功????能: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;}
???}
}
轉載于:https://www.cnblogs.com/fery/archive/2010/08/01/1790094.html
總結
以上是生活随笔為你收集整理的C#开发XML WebService接口(SOAP)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 轻轻松松为你的手机截图
- 下一篇: C++ Q16: dereferenci