ASP.NET MVC-取代JsonResult新選擇-招喚JilResult
在前集,找到以效能(速度)為主軸的Jil套件,經過自我驗證後,在JSON(反)序列化效能上確實不差,這一篇我們就利用ASP.NET MVC優秀的擴充機制以新的JilResult來取代原有的JsonResult,以完成JavaScriptSerializer退休的使命,讓ASP.NET MVC換上一顆高速的JSON(反)序列化引擎。
JilResult
using System; using System.Web; using System.Web.Mvc; using Jil; using System.IO; public class JilResult : JsonResult { public Options JilOptions { get; set; } public JilResult() { // 指定日期格式 JilOptions = new Options(dateFormat: DateTimeFormat.ISO8601); } public override void ExecuteResult(ControllerContext context) { if (context == null) throw new ArgumentNullException("context"); HttpResponseBase response = context.HttpContext.Response; response.ContentType = !string.IsNullOrEmpty(ContentType) ? ContentType : "application/json"; if (ContentEncoding != null) response.ContentEncoding = ContentEncoding; if (Data != null) { using (var writer = new StreamWriter(response.OutputStream)) { // 使用Jil進行序列化 JSON.Serialize(Data, writer, JilOptions); writer.Flush(); } // 也可這樣寫 // response.Write(JSON.Serialize(Data, jilOptions)); } } }
Jil序列化時指定日期格式為ISO8601。
JilController
public class JilController : Controller { protected override JsonResult Json(object data, string contentType, Encoding contentEncoding, JsonRequestBehavior behavior) { if (behavior == JsonRequestBehavior.DenyGet && string.Equals(this.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase)) //Call JsonResult to throw the same exception as JsonResult return new JsonResult(); return new JilResult() { Data = data, ContentType = contentType, ContentEncoding = contentEncoding }; } }
透過對JilContorller的封裝,開發者只要改為繼承JilController就能保持原有return Json();
的習慣,但內部改用Jil實作的JilResult來執行序列化的工作。
public class JController : JilController { public ActionResult Index() { return Json(DateTime.Now, JsonRequestBehavior.AllowGet); } }
先簡單確認序列化日期是正常的。
public class JController : JilController { public ActionResult Index() { // 取得2萬筆資料 ListbigList = new User().GenSimData(); return Json(bigList, JsonRequestBehavior.AllowGet); } }
透過之前的評比程式取得2萬筆資料進行序列化測試。再提醒一次,Jil的序列化會進行UTC時區處理,所以資料接收端要進行時區修正的動作。
小結
如果你在ASP.NET MVC專案中使用到JsonResult,請不要客氣,最少最少替換為JsonNetResult或JsonNetController,如果是想提升效能為主,那Jil是個還在持續開發且本身就是以效能為主的理想選擇。
替ASP.NET MVC換上JilResult就此停手嗎?嘿嘿嘿,好像還有一個預設使用JSON.NET的Framework,實在吃那個也癢吃這個也癢。下一集「ASP.NET Web API-取代JsonFormatter新選擇-招喚JilFormatter」。
Github Sample Source code:KK.JilTest
沒有留言:
張貼留言
感謝您的留言,如果我的文章你喜歡或對你有幫助,按個「讚」或「分享」它,我會很高興的。