2017-02-25 55 views
0

我正在学习如何使用.NET框架。我正在使用ASP .NET核心。直到最近我通过提出很少的请求来保持配额,并且从我安装dotnetbrowser库开始,我从未有过或者打过我的天蓝色webhosting配额。它是我的项目的最佳库,因为它可以让数据更容易。但是,如果有人能告诉我如何在不使用浏览器控件(如Web浏览器或dotnetbrowser)的情况下获取相同数据,我将不胜感激。我需要的数据在提供所需值之前需要经过多个服务器和客户端通信。所以我的问题是如何在不使用浏览器控件的情况下实现同样的功能?我该如何减少我在azure上运行的应用程序的内存使用量

最后,我的代码可能是错误的,因为我不太熟悉线程和任务。我可能会使用太多的内存。所以下面是我的代码

using DotNetBrowser; 
using Newtonsoft.Json.Linq; 
using System.Collections.Generic; 
using System.Text; 
using System.Text.RegularExpressions; 
using System.Threading; 
using System.Web; 
using System.Web.Http; 

namespace AjaxRequest.Controllers 
{ 
public class ValuesController : ApiController 
{ 

    private static ManualResetEvent waitEvent; 
    private static List<string> ajaxUrls = new List<string>(); 
    static string str = ""; 
    public static Browser browser; 


    public ValuesController() 
    { 


     waitEvent = new ManualResetEvent(false); 
     browser = BrowserFactory.Create(); 
     browser.Context.NetworkService.ResourceHandler = new AjaxResourceHandler(); 
     browser.Context.NetworkService.NetworkDelegate = new AjaxNetworkDelegate(); 


    } 




    // GET api/values 
    public string Get(int id, string title) 
    { 
     string Title = title.Replace(" ", "-"); 

     browser.LoadURL(string.Format("https://ba.com/foo/{0}-{1}/something.html", Title, id)); 
     waitEvent.WaitOne(); 


     browser.Dispose(); 
     string Json = Regex.Replace(str, @"\\",""); 

     return Json.Replace("\\\"", "\""); 


    } 

    public class AjaxResourceHandler : ResourceHandler 
    { 
     //HomeController hc; 
     public bool CanLoadResource(ResourceParams parameters) 
     { 
      if (parameters.ResourceType == ResourceType.XHR && parameters.URL.Contains("https://something.com/ajax/blahblah")) 
      { 

       ajaxUrls.Add(parameters.URL); 

      } 

      return true; 
     } 
    } 

    public class AjaxNetworkDelegate : DefaultNetworkDelegate 
    { 
     //HomeController hc; 
     public override void OnDataReceived(DataReceivedParams parameters) 
     { 

      if (ajaxUrls.Contains(parameters.Url)) 
      { 

       PrintResponseData(parameters.Data); 

      } 


     } 
     public void PrintResponseData(byte[] data) 
     { 


      str = Encoding.UTF8.GetString(data); 
      ajaxUrls.Clear(); 
      browser.Stop(); 
      browser.dispose(); 
      waitEvent.Set(); 

     } 
     public void error(string info) 
     { 


      str = info; 


      waitEvent.Set(); 

     } 



    } 

} 
} 

是否有可能我做错了?如果是这种情况,如何改进以节省内存或数据?

UPDATE:我使用蔚蓝免费托管服务enter image description here

+0

你能解释一下你在网络应用中用DotNetBrowser做什么吗? –

+0

该应用程序与网站进行通信,当值被馈送到网站获取我的数据时,会经过一系列的Ajax请求,然后铬包装器通过JavaScript执行数据,然后发出另一个Ajax请求,结果会一直持续到所需的数据得到。我不知道httpclient可以做到这一点。在我的情况下,当我收听XHR请求...在获得我想要的数据之前,需要4个需要XHR请求。 – Cody

+0

在本声明中,您没有解释清楚您的目标是什么:**我需要的数据在提供所需值之前需要经过多个服务器和客户端通信** ---我们无法提供基于此的替代解决方案... – Svek

回答

0

DotNetBrowser是铬包装 - 我不完全知道你为什么会需要它在一个Web应用程序,但这么说,这是有可能是罪魁祸首。一旦你删除它,你可以使用HttpClient来执行正确的请求,而无内存开销。

从分析角度来看,您最好的选择是从Application Insights开始 - it's enabled by default in ASP.NET Core projects。它将允许跨应用程序组件进行资源跟踪。

+0

我正在将它用于我的API。我收到的数据不能用httpclient获得,因为数据来自多个来源的Ajax请求。我不知道我是否解释得好,但对于例如。如果发出Ajax请求,如果可以获取浏览器可以通过JavaScript执行的数据,则会将结果传递给另一个Ajax请求,直到获得所需的值。这就是为什么我需要浏览器控制。使用httpwebrequest或其他Web客户端不是浏览器控件将只下载dom文件,而不会执行jquery以获取所需的字符串或JSON – Cody

+0

这应该是一个评论,而不是一个答案,因为它只是一个建议内存使用情况,而不是根本原因修复。 –

+0

@Cody你一定可以通过'HttpClient'获取你想要的数据。在Web应用程序中使用Chromium包装器是绝对没有必要的。 –

0

看起来好像你有多个运行的浏览器实例。

我可以建议检查浏览器实例是否正确放置。如果不是,您可以尝试将其置于控制器的Dispose方法中。

+0

我将它设置为立即处理我需要的数据。但是你能解释一下还是让我知道我可能如何运行多个浏览器实例。谢谢 – Cody

相关问题