1:首先WebService方法定義,每一個方法定義兩個參數,一個用於驗證權限,string格式的XML文本用於傳輸數據。最終目的實現,WebService方法,驗證權限,獲取XML數據,處理以後返回XML數據。一下面一段代碼爲例進行說明:node
[WebMethodAttribute(Description = "新增督學計劃")] public string InspectorPlan_Add(string Token, string XMLParas) { try { //安全憑證檢查 if (!TokenAuth.Check(Token)) { //爲了測試方便先註釋掉 //return this.GetResult(false, "安全憑證無效!", ""); } Hashtable paras = GetParametersFromXML(XMLParas); //檢查參數是否存在 string msg = this.CheckParas("InspectorGuid,Year,Month,MainContent", paras); if (msg != "") { return GetResult(false, msg, "", "InspectorPlan_Add", XMLParas); } string UserGuid = paras["InspectorGuid"].ToString(); //用戶UserGuid string Year = paras["Year"].ToString();//傳過來的月份 string Month = paras["Month"].ToString();//傳過來的月份 string MainContent = paras["MainContent"].ToString();//傳過來的計劃內容 //根據UserGuid獲取用戶所在部門名稱,所在部門Guid,用戶姓名 string UserInfoSql = "select a.userguid,a.displayname,b.ouguid,b.ouname from frame_user a join frame_ou b on a.ouguid = b.ouguid where a.userguid ='" + UserGuid + "'"; //查詢該月督學計劃是否存在,存在則不能重複插入 if (DB_XXTInspectorPlan.InspectorPlan_CheckExist(UserGuid, Year, Month)) { //若是該月已經存在,則提示月度督學計劃重複 return GetResult(false, "月度督學計劃重複", "", "AddInspectorPlan", XMLParas); } else { DataView dv = Epoint.EduFront.Bizlogic.DB_Common.ExecuteToDataView(UserInfoSql); if (dv.Count > 0) { string RowGuid = DB_XXTInspectorPlan.InspectorPlan_Add(dv[0]["UserGuid"].ToString(), dv[0]["displayname"].ToString(), dv[0]["ouguid"].ToString(), dv[0]["ouname"].ToString(), MainContent, Year, Month); //評價成功,返回評價的rowguid return GetResult(true, "添加成功", "<RowGuid>" + RowGuid + "</RowGuid>", "AddInspectorPlan", XMLParas); } else { return GetResult(false, "", "<RowGuid>添加失敗</RowGuid>", "ParEvaSchInsert", XMLParas); } } } catch (Exception ex) { ErrorLog("AddInspectorPlan", XMLParas, ex.Message); return GetResult(false, ex.Message, "", "AddInspectorPlan", XMLParas); } }
2:Token參數用於驗證權限,XMLParas用於傳遞string格式的XML數據瀏覽器
此方法須要傳遞的參數以下:安全
<?xml version="1.0" encoding="gb2312" ?> <paras> <InspectorGuid>當前用戶UserGuid</InspectorGuid> <Year>年份,1000至9999字符串。(☆注意必須是四位)</Year> <Month>月份,01至12字符串。(☆注意必須是兩位)</Month> <MainContent>督學計劃內容</MainContent> </paras>
3:循環解析每一個節點獲取對應的參數值,Hashtable paras = GetParametersFromXML(XMLParas);該語句調用解析XML字符串並轉化參數到HashTable中ide
GetParametersFromXML方法以下:測試
Hashtable paras = GetParametersFromXML(XMLParas);
public Hashtable GetParametersFromXML(string XMLParameters) { XmlDocument xml = new XmlDocument(); xml.LoadXml(XMLParameters); XmlNode DataNode = xml.SelectSingleNode("paras"); Hashtable Parameters = new Hashtable(); foreach (XmlNode node in DataNode.ChildNodes) { Parameters.Add(node.Name, node.InnerText); } return Parameters; }
4:檢查必填參數是否存在,並對缺乏的參數給出提示。checkParas方法,用於檢測每一個參數。實現代碼以下:ui
//檢查參數是否存在,第一個值爲必填參數節點名稱,每一個參數用","隔開 string msg = this.CheckParas("InspectorGuid,Year,Month,MainContent", paras);
/// <summary> /// 檢查是否缺乏參數必填參數 /// </summary> /// <param name="Parastr">參數名稱,多個參數用逗號隔開</param> /// <param name="Paras">獲取到參數Hastable</param> /// <returns></returns> public string CheckParas(string Parastr, Hashtable Paras) { string[] listParas = Parastr.Split(','); string Error = ""; for (int i = 0; i < listParas.Length; i++) { if (listParas[i] != "") { if (!Paras.ContainsKey(listParas[i])) { Error += listParas[i] + ","; } } } if (Error != "") { return "缺乏參數:" + Error.TrimEnd(','); } else { return ""; } }
5:確認必填參數存在後獲取對應的參數值,進行操做,每一個XML參數的節點名稱做爲hashtable的name,每一個節點的值做爲nodevalue,根據nodename獲取參數值代碼this
string UserGuid = paras["InspectorGuid"].ToString(); //用戶UserGuid string Year = paras["Year"].ToString();//傳過來的月份 string Month = paras["Month"].ToString();//傳過來的月份 string MainContent = paras["MainContent"].ToString();//傳過來的計劃內容
6:參數的返回,對獲取的數據處理後,把須要返回的數據用拼接爲XML格式的字符串返回。spa
string UserInfoSql = "select a.userguid,a.displayname,b.ouguid,b.ouname from frame_user a join frame_ou b on a.ouguid = b.ouguid where a.userguid ='" + UserGuid + "'"; //查詢該月督學計劃是否存在,存在則不能重複插入 if (DB_XXTInspectorPlan.InspectorPlan_CheckExist(UserGuid, Year, Month)) { //若是該月已經存在,則提示月度督學計劃重複 return GetResult(false, "月度督學計劃重複", "", "AddInspectorPlan", XMLParas); } else { DataView dv = Epoint.EduFront.Bizlogic.DB_Common.ExecuteToDataView(UserInfoSql); if (dv.Count > 0) { string RowGuid = DB_XXTInspectorPlan.InspectorPlan_Add(dv[0]["UserGuid"].ToString(), dv[0]["displayname"].ToString(), dv[0]["ouguid"].ToString(), dv[0]["ouname"].ToString(), MainContent, Year, Month); //評價成功,返回評價的rowguid return GetResult(true, "添加成功", "<RowGuid>" + RowGuid + "</RowGuid>", "AddInspectorPlan", XMLParas); } else { return GetResult(false, "", "<RowGuid>添加失敗</RowGuid>", "ParEvaSchInsert", XMLParas); } }
public string GetResult(bool status, string description, string UserData, string MethodName, string XMLPars) { StringBuilder sb = new StringBuilder(); sb.Append("<?xml version=\"1.0\" encoding=\"gb2312\"?>"); sb.Append("<EpointDataBody>"); sb.Append("<DATA>"); sb.Append("<ReturnInfo>"); sb.Append("<Status>" + status.ToString() + "</Status>"); sb.Append("<Description><![CDATA[" + description + "]]></Description>"); sb.Append("</ReturnInfo>"); if (status && UserData != "") { sb.Append("<UserArea>" + UserData + "</UserArea>"); } sb.Append("</DATA>"); sb.Append("</EpointDataBody>"); //保存接口調用日誌 //string ClientIP = Context.Request.ServerVariables.GetValues("REMOTE_ADDR")[0]; //DB_XXTWebServiceLog.InsertLog(ClientIP, MethodName, System.Text.Encoding.Default.GetBytes(XMLPars), System.Text.Encoding.Default.GetBytes(sb.ToString()), status ? "1" : "0", description); return sb.ToString(); }
7:最終實現返回的XML格式文本以下:3d
新增成功時返回插入行的RowGuid <?xml version="1.0" encoding="gb2312"?> <EpointDataBody> <DATA><ReturnInfo><Status>True</Status><Description> <![CDATA[插入成功]]> </Description></ReturnInfo><UserArea> <RowGuid>42ccaec8-9091-4950-a653-ecbb4328428c</RowGuid> </UserArea> </DATA> </EpointDataBody> 一個月份重複插入時返回: <EpointDataBody><DATA> <ReturnInfo><Status>False</Status> <Description><![CDATA[月度計劃重複]]> </Description></ReturnInfo></DATA> </EpointDataBody>
8:最後的也是最重要的一步造成文檔,以方便調用此方法的人進行開發。日誌
服務名稱 |
InspectorPlan_Add |
|||
服務說明 |
插入用戶所填寫的督學計劃信息 |
|||
輸入值 |
<?xml version="1.0" encoding="gb2312" ?> <paras> <InspectorGuid>當前用戶UserGuid</InspectorGuid> <Year>年份,1000至9999字符串。(☆注意必須是四位)</Year> <Month>月份,01至12字符串。(☆注意必須是兩位)</Month> <MainContent>督學計劃內容</MainContent> </paras>
|
|||
輸入參數詳細 |
參數名稱 |
參數說明 |
類型 |
是否必填 |
UserGuid |
當前用戶UserGuid |
字符型 |
是 |
|
Year |
所選擇年份Year |
字符型 |
是 |
|
Month |
月份,01至12字符串 |
字符型 |
是 |
|
MainContent |
計劃內容 |
字符型 |
是 |
|
返回值 |
新增成功時返回插入行的RowGuid <?xml version="1.0" encoding="gb2312"?> <EpointDataBody> <DATA><ReturnInfo><Status>True</Status><Description> <![CDATA[插入成功]]> </Description></ReturnInfo><UserArea> <RowGuid>42ccaec8-9091-4950-a653-ecbb4328428c</RowGuid> </UserArea> </DATA> </EpointDataBody> 一個月份重複插入時返回: <EpointDataBody><DATA> <ReturnInfo><Status>False</Status> <Description><![CDATA[月度計劃重複]]> </Description></ReturnInfo></DATA> </EpointDataBody>
|
9:瀏覽器中測試的結果