2017-02-25 7 views
0

.NET Framework를 사용하는 방법을 배우고 있습니다. ASP .NET 코어로 작업하고 있습니다. 최근까지 웹 호스팅 할당량을 얻거나 얻지 못했습니다. 요청이 거의 없기 때문에 할당량을 계속 늘리고 있습니다. dotnetbrowser 라이브러리를 설치 한 이후로 시작되었습니다. 데이터를 쉽게 가져 오기 때문에 내 프로젝트에 가장 적합한 라이브러리입니다. 그러나 누군가가 웹 브라우저 나 dotnetbrowser 같은 브라우저 컨트롤을 사용하지 않고 동일한 데이터를 얻는 방법을 말해 줄 수 있다면 고맙겠습니다. 필자가 필요로하는 데이터는 필요한 값이 제공되기 전에 여러 서버 및 클라이언트 통신을 거쳐야합니다. 그래서 내 질문에 어떻게 브라우저 컨트롤을 사용하지 않고 동일한 것을 얻을 수있다?푸른 색을 사용하는 응용 프로그램에서 메모리 사용량을 줄일 수있는 방법

마침내 스레드와 작업에 익숙하지 않다는 것을 감안할 때 내 코드가 버그가있을 수 있습니다. 너무 많은 메모리를 사용하고있을 수도 있습니다. 아래 코드가 내 코드

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는 크롬 래퍼입니다. 제거한 후에는 HttpClient을 사용하여 메모리 오버 헤드없이 올바른 요청을 수행 할 수 있습니다.

프로파일 링 방식의 경우 가장 좋은 방법은 Application Insights - it's enabled by default in ASP.NET Core projects으로 시작하는 것입니다. 앱 구성 요소에서 리소스를 추적 할 수 있습니다.

+0

내 API 용으로 사용하고 있습니다. 데이터가 여러 소스로부터의 Ajax 요청으로부터 나왔기 때문에 내가받은 데이터는 httpclient로 얻을 수 없다. 나는 그것을 잘 설명 할 지 모르지만 예를 들면. Ajax 요청이있는 경우 브라우저가 JavaScript를 통해 실행할 수있는 데이터를 얻을 수 있다면 필요한 값을 얻을 때까지 다른 Ajax 요청에 결과를 전달합니다. 그래서 브라우저 컨트롤이 필요합니다. 브라우저 컨트롤이 아닌 httpwebrequest 또는 다른 웹 클라이언트를 사용하면 DOM 파일을 다운로드하고 필요한 문자열 또는 JSON을 얻기 위해 jquery가 실행되지 않습니다. – Cody

+0

이것은 설명이 아닌 주석이어야합니다. 메모리 사용이 아니라 근본 원인 수정. –

+0

@Cody 당신은'HttpClient'를 통해 원하는 데이터를 확실히 얻을 수 있습니다. 웹 앱에서 Chromium 래퍼를 사용하는 것은 절대 필요하지 않습니다. –

0

두 개 이상의 브라우저 인스턴스가있는 것처럼 보입니다.

브라우저 인스턴스가 올바르게 배치되었는지 확인할 것을 제안 할 수 있습니다. 그렇지 않은 경우 컨트롤러의 Dispose 메소드에서 폐기 할 수 있습니다.

+0

필요한 데이터를 즉시 처리하도록 설정했습니다. 하지만 더 설명하거나 여러 브라우저 인스턴스를 실행하는 방법을 보여 주시겠습니까? 감사 – Cody