2017-02-19 10 views
2

XMlHTTPRequest 응답 본문을 통해 JSON 문자열을 반환하려고합니다. 문제는 AjaxResourceHandler의 메소드 작성 및 인스턴스 이후에 빈 문자열을 리턴하는 필수 데이터를 얻기 전에 Get 메소드를 실행하는 것입니다. 내가 원하는 것은 json 문자열로 응답 본문을 반환 할 수 있어야한다는 것입니다. 과 한 가지 더. webbrowser는 똑같은 일을 할 수 있습니까? 그렇다면 어떻게?Books 돌아 가기 dotnetbrowser

using AjaxRequest.Models; 
using DotNetBrowser; 
using Newtonsoft.Json; 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Net; 
using System.Net.Http; 
using System.Text; 
using System.Web.Http; 

namespace AjaxRequest.Controllers 
{ 
public class ValuesController : ApiController 
{ 


    private static List<string> ajaxUrls = new List<string>(); 
    private static List<string> sourceDat = new List<string>(); 
    private static Browser browser; 

    public ValuesController() 
    { 
     browser = BrowserFactory.Create(); 
     browser.Context.NetworkService.ResourceHandler = new AjaxResourceHandler(); 
     browser.Context.NetworkService.NetworkDelegate = new AjaxNetworkDelegate(); 

     browser.LoadURL("https://www.w3schools.com/xml/ajax_examples.asp"); 
     //browser.Dispose(); 
    } 


    // GET api/values 
    public IEnumerable<string> Get() 
    { 
     //Init(); 
     return sourceDat; 

    } 

    // GET api/values/5 
    public string Get(int id) 
    { 

     return "value"; 

    } 

    // POST api/values 
    public void Post([FromBody]string value) 
    { 
    } 

    // PUT api/values/5 
    public void Put(int id, [FromBody]string value) 
    { 
    } 

    // DELETE api/values/5 
    public void Delete(int id) 
    { 
    } 

    //private void Init() 
    //{ 

    //} 

    public class AjaxResourceHandler : ResourceHandler 
    { 
     public bool CanLoadResource(ResourceParams parameters) 
     { 
      if (parameters.ResourceType == ResourceType.XHR && parameters.URL.Contains("https://123movies.is/ajax/v2_get_sources")) 
      { 

       ajaxUrls.Add(parameters.URL); 

      } 
      return true; 
     } 
    } 

    public class AjaxNetworkDelegate : DefaultNetworkDelegate 
    { 
     public override void OnDataReceived(DataReceivedParams parameters) 
     { 
      if (ajaxUrls.Contains(parameters.Url)) 
      { 

       PrintResponseData(parameters.Data); 

      } 

     } 
     public void PrintResponseData(byte[] data) 
     { 

      var str = Encoding.UTF8.GetString(data); 

      BookSource _sources = JsonConvert.DeserializeObject<BookSource>(str); 
      sourceDat.Add(_sources.ToString()); 
      browser.Dispose(); 
      //source.Add(_sources); 

      //return source; 
     } 

    } 

} 
} 

답변

2

당신은 AJAX 응답이 잡힐 때까지 메인 스레드를 차단하는 ManualResetEvent를 사용하여 시도 할 수 있습니다. 아래의 샘플 코드는이 방법을 구현하는 방법을 보여줍니다 : 내가 아는 한

using AjaxRequest.Models; 
using DotNetBrowser; 
using Newtonsoft.Json; 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Net; 
using System.Net.Http; 
using System.Text; 
using System.Threading; 
using System.Web.Http; 

namespace AjaxRequest.Controllers 
{ 
    public class ValuesController : ApiController 
    { 

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

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

      browser.LoadURL("https://www.w3schools.com/xml/ajax_examples.asp"); 
      //browser.Dispose(); 
     } 

     // GET api/values 
     public IEnumerable<string> Get() 
     { 
      //Init(); 
      waitEvent.WaitOne(); 
      return sourceDat; 

     } 

     // GET api/values/5 
     public string Get(int id) 
     { 

      return "value"; 

     } 

     // POST api/values 
     public void Post([FromBody]string value) 
     { 
     } 

     // PUT api/values/5 
     public void Put(int id, [FromBody]string value) 
     { 
     } 

     // DELETE api/values/5 
     public void Delete(int id) 
     { 
     } 

     //private void Init() 
     //{ 

     //} 

     public class AjaxResourceHandler : ResourceHandler 
     { 
      public bool CanLoadResource(ResourceParams parameters) 
      { 
       if (parameters.ResourceType == ResourceType.XHR && parameters.URL.Contains("https://123movies.is/ajax/v2_get_sources")) 
       { 

        ajaxUrls.Add(parameters.URL); 

       } 
       return true; 
      } 
     } 

     public class AjaxNetworkDelegate : DefaultNetworkDelegate 
     { 
      public override void OnDataReceived(DataReceivedParams parameters) 
      { 
       if (ajaxUrls.Contains(parameters.Url)) 
       { 

        PrintResponseData(parameters.Data); 

       } 

      } 
      public void PrintResponseData(byte[] data) 
      { 

       var str = Encoding.UTF8.GetString(data); 

       BookSource _sources = JsonConvert.DeserializeObject<BookSource>(str); 
       sourceDat.Add(_sources.ToString()); 
       waitEvent.Set(); 
       browser.Dispose(); 
       //source.Add(_sources); 

       //return source; 
      } 

     } 

    } 
} 

를 웹 브라우저에서 직접 AJAX의 responce를 가로 챌 가능성은 없다. ObjectForScripting을 통해이를 차단하는 해결 방법이있는 것 같습니다. catch ajax response data in web browser control C#

+0

매우 효과적입니다. ObjectForScripting을 살펴볼 것입니다. – Cody