2017-02-25 8 views
0

私は.NETフレームワークの使い方を学んでいます。私はASP .NETコアで作業しています。私は最近まで私の晴れのウェブホスティングクォータを持っていたり、ヒットしたりしていません。ごく少数のリクエストでクォータを打ち続けています。これは、dotnetbrowserライブラリをインストールして以来、これまでに始まっています。私のプロジェクトのための最良のライブラリです。なぜなら、データを簡単に入手できるからです。しかし、誰かが同じデータをWebブラウザやドットネットブラウザのようなブラウザコントロールを使わずに取得する方法を教えてもらえるかどうかは分かります。私が必要とするデータは、必要な値が提供される前に複数のサーバーとクライアントの通信を経由します。だから私の質問はどのようにブラウザコントロールを使用せずに同じことを達成することができますか?私は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

アプリケーションはWebサイトと通信し、値がWebサイトに送られると、一連のAjaxリクエストからデータが取得され、クロムラッパーがJavaScriptを介してデータを実行し、別のAjaxリクエストを実行します取得されます。私はhttpclientがこれを行うことができます知っていることはありません。私の場合、XHRリクエストを聞くと、必要なデータを取得する前に4回のXHR要求が必要です。 – Cody

+0

この声明では、あなたの目標が明確に説明されていません。**必要なデータが提供される前に複数のサーバーとクライアントの通信を行う必要があります** **これに基づいた代替ソリューションはサポートできません... – Svek

答えて

0

DotNetBrowser紺碧の無料ホスティングサービスを使用していますクロムラッパーである - 私はあなたがウェブアプリで、それを必要とする理由は全くわからないが、それは言った、犯人である可能性があります。削除したら、HttpClientを使用して、メモリオーバーヘッドのない正しい要求を実行できます。

Profiling-wiseの場合は、Application Insights - it's enabled by default in ASP.NET Core projectsから始めることをお勧めします。これにより、アプリケーションコンポーネント間でリソースをトラッキングできます。

+0

私は私のAPIのためにそれを使用しています。複数のソースからのAjaxリクエストからのデータであるため、受信したデータをhttpclientで取得することはできません。私はそれをうまく説明しているのかどうか分からない。 Ajaxリクエストが行われた場合、ブラウザがJavaScriptを介して実行できるデータを取得できた場合、必要な値が得られるまで別のAjaxリクエストに結果を渡します。私はブラウザコントロールが必要なのです。 httpwebrequestやブラウザコントロールではない他のWebクライアントを使ってDOMファイルをダウンロードするだけで、必要な文字列やJSONを取得するためにjqueryが実行されることはありません – Cody

+0

これはコメントではなく、答えでなければなりません。メモリ使用量であり、根本原因の修正ではありません。 –

+0

@Codyあなたは間違いなくあなたが望むデータを 'HttpClient'で得ることができます。ウェブアプリでChromiumラッパーを使用することは絶対に必要ありません。 –

0

実行中のブラウザインスタンスが複数あるようです。

ブラウザのインス​​タンスが正しく配置されていることを確認することをお勧めします。そうでない場合は、コントローラのDisposeメソッドで処理することができます。

+0

私は必要なデータがすぐに破棄されるように設定しました。もっと詳しく説明したり、複数のブラウザインスタンスをどのように実行しているかを教えてください。ありがとう – Cody

関連する問題