2016-09-23 14 views
3

MVC 5を使用して、私はJsonを返します。合計時間は、データが返されるポイントまで40ミリ秒です。ActionResultが返された後はどうなりますか?

ただし、サーバーでもデータを取得するには、ブラウザには6000 milliscondsが必要です。

私の質問は、値を返すとどうなりますか。私は遅い原因を見つけることを試みています。

public JsonResult Read(....) 
    { 
     var all = _userManager.GetStuff(); 
     var watch = Stopwatch.StartNew(); 
     var r= Json(all .....); 
     Trace.WriteLine("READ" + watch.ElapsedMilliseconds); 
     watch.Stop(); 

     return r; //Takes 40 milliseconds to get here 
    } 
+0

すべてのアイテムはどれくらいありますか?オブジェクトは単純なオブジェクトですか、複雑ですか? –

答えて

1

これはJsonResultタイプの内部コードです。ビューのポイント内部コードから

public override void ExecuteResult(ControllerContext context) 
{ 
    if (context == null) 
    throw new ArgumentNullException("context"); 
    if (this.JsonRequestBehavior == JsonRequestBehavior.DenyGet && string.Equals(context.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase)) 
    throw new InvalidOperationException(MvcResources.JsonRequest_GetNotAllowed); 
    HttpResponseBase response = context.HttpContext.Response; 
    response.ContentType = string.IsNullOrEmpty(this.ContentType) ? "application/json" : this.ContentType; 
    if (this.ContentEncoding != null) 
    response.ContentEncoding = this.ContentEncoding; 
    if (this.Data == null) 
    return; 
    JavaScriptSerializer scriptSerializer = new JavaScriptSerializer(); 
    if (this.MaxJsonLength.HasValue) 
    scriptSerializer.MaxJsonLength = this.MaxJsonLength.Value; 
    if (this.RecursionLimit.HasValue) 
    scriptSerializer.RecursionLimit = this.RecursionLimit.Value; 
    response.Write(scriptSerializer.Serialize(this.Data)); 
} 

JavaScriptSerializerはあなたがJsonResultに渡すオブジェクトをシリアル化するために使用されるタイプです。あなたのコードが遅いプロセスを取っている段階であるかどうかを確認することができます。

は、このようなあなたのコントローラを作ってみる:

public JsonResult Read(....) 
{ 
    var all = _userManager.GetStuff(); 
    var watch = Stopwatch.StartNew(); 

    var scriptSerializer = new JavaScriptSerializer(); 
    var json = scriptSerializer.Serialize(all); 

    Trace.WriteLine("READ" + watch.ElapsedMilliseconds); 
    watch.Stop(); 

    return json; //Takes 40 milliseconds to get here 
} 

問題が解決しない場合は、代替手段を実装することができ、あなたがbetter resultsを提供することができますJSON.Netライブラリを、使用して、独自化するJsonResultを実装することができます。サンプルについては、名前空間を追加します。

using Newtonsoft.Json; 

コントローラ:

public JsonResult Read(....) 
{ 
    var all = _userManager.GetStuff(); 
    var watch = Stopwatch.StartNew(); 

    var json = JsonConvert.SerializeObject(all); 

    Trace.WriteLine("READ" + watch.ElapsedMilliseconds); 
    watch.Stop(); 

    return Content(json, "application/json"); //Takes 40 milliseconds to get here 
} 

そして最後に、あなたはパフォーマンスを比較することができます。もう1つの可能な方法は、xmlやバイナリなどのシリアライゼーションをスピードアップできる別のフォーマットを使用することです。

関連する問題