2014-02-18 38 views
0

我有一个WebAPI Web服务。我正在返回一个Json字符串。控制器返回ActionResult,但我也试过使它成为JsonRequest。这并不影响结果。ASP.NET MVC JsonResult非常慢

下面是相关的代码(记住,函数原型只是返回的ActionResult:

 Debug.WriteLine(string.Format("{0} - get campaign data: {1}", DateTime.Now.ToString("hh:mm:ss.fff"), 1)); 

     // Here is the data we're going to need 
     var currentUser = context.Users.Where(n => n.UserID == userId).Single(); 
     var locations = context.Locations.Where(n => n.CampaignID == campaign.CampaignID && n.Inactive == false); 
     var questions = context.Questions.Where(n => n.CampaignID == campaign.CampaignID && n.Inactive == false).Include(n => n.QuestionType).ToList().OrderBy(q=> q.SortOrder); 
     var dispositions = context.Dispositions.Where(n => n.CampaignID == campaign.CampaignID).ToList().OrderBy(d=> d.SortOrder); 
     var answers = context.Answers.Where(a => a.Inactive == false).Join(locations, answer => answer.LocationID, loc => loc.LocationID, (ans, loc) => ans).ToList(); 
     var contacts = context.Contacts.Where(c => c.Inactive == false); 

     Debug.WriteLine(string.Format("{0} - get campaign data: {1}", DateTime.Now.ToString("hh:mm:ss.fff"), 2)); 

     var json = new 
      { 
       success = true, 
       data = new 
       { 
        User = currentUser.ToModel(), 
        Campaign = campaign.ToModel(), 
        Location = locations.ToList().ToModelsSpecial(answers, contacts), 
        Question = questions.OrderBy(q => q.SortOrder).ToModelsSpecial(), 
        Disposition = dispositions.ToModels(), 
       }, 
       message = (string)null 
      }; 

     Debug.WriteLine(string.Format("{0} - get campaign data: {1}", DateTime.Now.ToString("hh:mm:ss.fff"), 3)); 
     var response = Json(json, JsonRequestBehavior.AllowGet); 
     Debug.WriteLine(string.Format("{0} - get campaign data: {1}", DateTime.Now.ToString("hh:mm:ss.fff"), 4)); 

     return response; 

你可以看到我的Debug.WriteLine调试输出需要多长时间,所以我可以跟踪它。

所以问题是,所有的包括数据库查询的处理只需要大约2秒钟。它让所有的方式,通过这件事在那个时候。

可是我不想得到的结果客户再过25秒我正在使用像Fiddler这样的程序来测试它。这一切都在我的本地机器上,所以互联网不是问题。

返回的JSON字符串的大小为800K。由于这是所有本地我不会期望花25秒。

我运行在IIS8网站上的Windows 8

谁能告诉我,我这么长的时间的ActionResult要回客户端是什么服用?

+0

谁在使用此调用 - jquery ajax调用或其他客户端? – Newse

+0

我想知道数据如何呈现。如果将表连接到DOM,反复将数千行添加到html表中可能会使浏览器变慢。 – JayC

回答

0

看看这篇文章。我相信你有同样的问题,并修复刚刚更换插件:

Struts2+jsonplugin: response takes a long time to display in browser from remote server

+0

谢谢你的回复。我看了一下,我不认为它是一回事。 – user856232

+0

仔细研究之后,在调试代码时,Fiddler会导致更多开销。如果不存在问题,请尝试关闭脚本中的调试,然后在不使用提琴手的情况下运行它。这应该让您更好地了解调试是否会导致时间延长。 – James

+0

请记住,无论何时您调试代码,该过程都会在系统上造成大量开销,这可能会导致代码被多次扫描/执行。如果在debug/fiddler之外运行时仍然有问题,请告诉我。但从我现在可以看到的情况来看,这只是一个开销问题。 – James

0

只有当返回的字符串,而不是JsonResult我可以提高我的Json功能的速度。我现在不是为什么,但速度要快得多。也许是因为它少了转换。我正在使用mvc 5,尝试使用旧版本,但它不允许仅返回字符串JsonResult。

public String GetBooks() 
    { 


     var myBooks = db.Books(); 

     JavaScriptSerializer jsonSerializer = new JavaScriptSerializer(); 


     return (jsonSerializer.Serialize(myBooks)); 


    }