2017-02-25 57 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

相關問題