2016-09-23 2 views
3

Mit MVC 5 gebe ich Json zurück. Die Gesamtzeit beträgt 40 Millisekunden, um zu dem Punkt zu gelangen, an dem die Daten zurückgegeben werden.Was passiert, nachdem ActionResult zurückgegeben wurde?

Es dauert jedoch 6000 millisconds für den Browser, um die Daten zu erhalten, sogar auf dem Server ausgeführt wird.

Meine Frage ist, was passiert, nachdem ich den Wert zurückgegeben habe. Ich versuche herauszufinden, was die Langsamkeit verursacht.

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

Wie viele Elemente sind insgesamt, ist das Objekt Objekt einfaches Objekt oder komplex? –

Antwort

1

Dies ist der interne Code für den JsonResult Typ.

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)); 
} 

Aus der Sicht der interne Code, der JavaScriptSerializer die Art verwendet, um das Objekt, das Sie an die JsonResult passieren zu serialisiert. Sie können überprüfen, ob dies der Schritt ist, in dem der Code langsam verarbeitet wird.

Versuchen Sie Ihren Controller so zu machen:

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 
} 

Wenn das Problem weiterhin besteht, erhalten Sie eine alternative Implementierung könnte, könnten Sie Ihre eigene JsonResult mit der JSON.Net Bibliothek, implementieren, die better results zur Verfügung stellen kann. Für die Probe, fügen Sie den Namespace:

using Newtonsoft.Json; 

Der Controller:

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 
} 

Und schließlich konnte man die Leistung vergleichen. Eine andere Möglichkeit besteht darin, ein anderes Format zu verwenden, das die Serialisierung beschleunigen kann, z. B. XML oder Binär.

Verwandte Themen