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萬筆資料
List bigList = 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



沒有留言:
張貼留言
感謝您的留言,如果我的文章你喜歡或對你有幫助,按個「讚」或「分享」它,我會很高興的。