接上一篇:http://www.cnblogs.com/mazhiyuan/p/5224054.html
本篇是完結篇。主要講如何開始呼叫了,以及如何控制必須是Get請求或者必須是POST請求,是怎麼限定住的。
如上圖,我們以新聞模組為例子,建立一個News.ashx的前端處理檔案
<%@ WebHandler Language="C#" Class="News" %> using System; using System.Web; using System.IO; using System.Web.Script.Serialization; using ZGMZ.Model; using ZGMZ.BLL; using ZGMZ.UIL.App; using ZGMZ.UIL.App.News; using System.Collections.Specialized; using ZGMZ.UIL.Log; using ZGMZ.Config; /// <summary> /// 接受POST方式傳輸 /// </summary> public class News : IHttpHandler { public void ProcessRequest(HttpContext context) { string action = context.Request["action"]; string httpMethod = context.Request.HttpMethod.ToLower(); if (string.IsNullOrEmpty(action)) { context.Response.Write("{\"CodeId\":\"" + Code.FailActionIsNull.CodeId + "\",\"CodeDescription\":\"" + Code.FailActionIsNull.Description + "\",\"ErrorMessage\":\"請傳遞action引數\"}"); return; } CommandType type; if (!Enum.TryParse(action, out type)) { context.Response.Write("{\"CodeId\":\"" + Code.FailActionIsNotExists.CodeId + "\",\"CodeDescription\":\"" + Code.FailActionIsNotExists.Description + "\",\"ErrorMessage\":\"傳遞的Action值未在系統中註冊\"}"); return; } BaseCommand command = Factory.AppFactory().GetNewsFacade().CreateCommandInstance(type); if (httpMethod == "post") { Post post = command as Post; if (post == null) { context.Response.Write("{\"CodeId\":\"" + Code.FailHttpMethodError.CodeId + "\",\"CodeDescription\":\"" + Code.FailHttpMethodError.Description + "\",\"ErrorMessage\":\"建議嘗試更換請求方式\"}"); return; } post.Input = this.GetQueryParameters(context); try { post.Excute(); } catch (System.Exception exp) { context.Response.Write("{\"CodeId\":\"" + Code.FailServer.CodeId + "\",\"CodeDescription\":\"" + Code.FailServer.Description + "\",\"ErrorMessage\":\"" + exp.Message + "\"}"); return; } } if (httpMethod == "get") { Get get = command as Get; if (get == null) { context.Response.Write("{\"CodeId\":\"" + Code.FailHttpMethodError.CodeId + "\",\"CodeDescription\":\"" + Code.FailHttpMethodError.Description + "\",\"ErrorMessage\":\"建議嘗試更換請求方式\"}"); return; } get.Input = context.Request.Params; try { get.Excute(); } catch (System.Exception exp) { context.Response.Write("{\"CodeId\":\"" + Code.FailServer.CodeId + "\",\"CodeDescription\":\"" + Code.FailServer.Description + "\",\"ErrorMessage\":\"" + exp.Message + "\"}"); return; } } //LogAbstract log = LogFactory.GetFileLog(); //log.FileLogServerPath = Params.Global.FileLogServerPath; //log.WriteLog("app日誌", command.Output); context.Response.Write(command.Output); } /// <summary> /// 取傳輸過來的引數 /// </summary> /// <author>馬志遠</author> private string GetQueryParameters(HttpContext context) { Stream jsonDataStream = context.Request.InputStream; StreamReader reader = new StreamReader(jsonDataStream); string jsonData = reader.ReadToEnd(); reader.Close(); return jsonData; } public bool IsReusable { get { return false; } } }
程式碼細說:
string action = context.Request["action"]; 請求的型別。比如要新增新聞,那麼action的值就是之前講的AddAppNews。必須是這個值,以便於反射。名字必須跟AddAppNews.cs的一樣。
string httpMethod = context.Request.HttpMethod.ToLower(); 獲取請求方式。這個是用來控制為什麼請求必須是Get或者必須是POST的原因。
if (!Enum.TryParse(action, out type)) 當action名字跟.cs檔案不一致時,就會報錯。
Post post = command as Post; 限制了請求必須是POST,如果他是GET發過來的,那麼這個值post就會為null,然後返回錯誤訊息給呼叫調。
Get get = command as Get; 同樣的,這個程式碼,限制了請求必須是Get。如果用了POST方式,那麼這個get物件就會為null.
get.Excute(); 接著就開始處理相關業務了。
context.Response.Write(command.Output); 最後,使用command.Output將序列化成json或者xml格式的字串,返回給呼叫方。
最後:以我們新增新聞的為例子。。 他的POST請求的URL應該是這樣子:http://www.163.com/News.ashx?action=addappnews
如果是取新聞資料,那麼他的Get請求的url是這樣子:http://www.163.com/news.ashx?action=getappnewsbyuserid&userid=1
當你願意看到這裡時,後續還有4篇:下面是連結:
(原創)多系統間需要對接,我寫了一個介面框架。實用性非常強,寫出來大家交流。需要的可以直接搬過去用。(第1篇) http://www.cnblogs.com/mazhiyuan/p/5224046.html
(原創)物件導向的系統對接介面編寫。第2篇 http://www.cnblogs.com/mazhiyuan/p/5224049.html
(原創)物件導向的系統對接介面編寫。第3篇 http://www.cnblogs.com/mazhiyuan/p/5224050.html
(原創)物件導向的系統對接介面編寫。第4篇 http://www.cnblogs.com/mazhiyuan/p/5224054.html
(原創)物件導向的系統對接介面編寫。第5篇(完結) http://www.cnblogs.com/mazhiyuan/p/5224056.html
如果看完,有不明白的可以評論發給我。
真的很好用的。。有需要做介面的同學。。可以把整個框架拿去用下。
提供原始碼下載,請點選:原始碼