C# 通过dotnetbrowser返回图书json
我试图通过XMlHTTPRequest响应体返回JSON字符串。问题是,在方法创建和AjaxResourceHandler实例之后,它将继续执行Get方法,然后再获取返回空字符串的所需数据。我想要的是能够以json字符串的形式返回响应体。 还有一件事。webbrowser能做同样的事情吗?如果是,怎么做C# 通过dotnetbrowser返回图书json,c#,json,api,web,dotnetbrowser,C#,Json,Api,Web,Dotnetbrowser,我试图通过XMlHTTPRequest响应体返回JSON字符串。问题是,在方法创建和AjaxResourceHandler实例之后,它将继续执行Get方法,然后再获取返回空字符串的所需数据。我想要的是能够以json字符串的形式返回响应体。 还有一件事。webbrowser能做同样的事情吗?如果是,怎么做 using AjaxRequest.Models; using DotNetBrowser; using Newtonsoft.Json; using System; using System.
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;
}
}
}
}
使用AjaxRequest.Models;
使用dotnebrowser;
使用Newtonsoft.Json;
使用制度;
使用System.Collections.Generic;
使用System.Linq;
Net系统;
使用System.Net.Http;
使用系统文本;
使用System.Web.Http;
命名空间AjaxRequest.Controllers
{
公共类值控制器:ApiController
{
私有静态列表ajaxURL=new List();
私有静态列表sourceDat=新列表();
专用静态浏览器;
公共价值控制人()
{
browser=BrowserFactory.Create();
browser.Context.NetworkService.ResourceHandler=新的AjaxResourceHandler();
browser.Context.NetworkService.NetworkDelegate=新的AjaxNetworkDelegate();
browser.LoadURL(“https://www.w3schools.com/xml/ajax_examples.asp");
//browser.Dispose();
}
//获取api/值
公共IEnumerable Get()
{
//Init();
返回源数据;
}
//获取api/values/5
公共字符串Get(int-id)
{
返回“值”;
}
//后api/值
公共作废帖子([FromBody]字符串值)
{
}
//将api/values/5放入
公共void Put(int id,[FromBody]字符串值)
{
}
//删除api/values/5
公共无效删除(int-id)
{
}
//私有void Init()
//{
//}
公共类AjaxResourceHandler:ResourceHandler
{
公共bool CanLoadResource(ResourceParams参数)
{
if(parameters.ResourceType==ResourceType.XHR&¶meters.URL.Contains()https://123movies.is/ajax/v2_get_sources"))
{
添加(parameters.URL);
}
返回true;
}
}
公共类AjaxNetworkDelegate:DefaultNetworkDelegate
{
公共覆盖无效OnDataReceived(DataReceivedParams参数)
{
if(ajaxUrls.Contains(parameters.Url))
{
PrintResponseData(参数、数据);
}
}
public void PrintResponseData(字节[]数据)
{
var str=Encoding.UTF8.GetString(数据);
BookSource _sources=JsonConvert.DeserializeObject(str);
sourceDat.Add(_sources.ToString());
browser.Dispose();
//source.Add(_sources);
//返回源;
}
}
}
}
您可以尝试使用ManualResetEvent
阻止主线程,直到捕获AJAX响应。
下面的示例代码演示了如何实现此方法:
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;
}
}
}
}
使用AjaxRequest.Models;
使用dotnebrowser;
使用Newtonsoft.Json;
使用制度;
使用System.Collections.Generic;
使用System.Linq;
Net系统;
使用System.Net.Http;
使用系统文本;
使用系统线程;
使用System.Web.Http;
命名空间AjaxRequest.Controllers
{
公共类值控制器:ApiController
{
私有静态手动重置事件等待事件;
私有静态列表ajaxURL=new List();
私有静态列表sourceDat=新列表();
专用静态浏览器;
公共价值控制人()
{
waitEvent=waitEvent=new ManualResetEvent(错误);
browser=BrowserFactory.Create();
browser.Context.NetworkService.ResourceHandler=新的AjaxResourceHandler();
browser.Context.NetworkService.NetworkDelegate=新的AjaxNetworkDelegate();
browser.LoadURL(“https://www.w3schools.com/xml/ajax_examples.asp");
//browser.Dispose();
}
//获取api/值
公共IEnumerable Get()
{
//Init();
waitEvent.WaitOne();
返回源数据;
}
//获取api/values/5
公共字符串Get(int-id)
{
返回“值”;
}
//后api/值
公共作废帖子([FromBody]字符串值)
{
}
//将api/values/5放入
公共void Put(int id,[FromBody]字符串值)
{
}
//删除api/values/5
公共无效删除(int-id)
{
}
//私有void Init()
//{
//}
公共类AjaxResourceHandler:ResourceHandler
{
公共bool CanLoadResource(ResourceParams参数)
{
if(parameters.ResourceType==ResourceType.XHR&¶meters.URL.Contains()https://123movies.is/ajax/v2_get_sources"))
{
添加(parameters.URL);
}
返回true;
}
}
公共类AjaxNetworkDelegate:DefaultNetworkDelegate
{
公共覆盖无效OnDataReceived(DataReceivedParams参数)
{
if(ajaxUrls.Contains(parameters.Url))
{
PrintResponseData(参数、数据);
}
}
public void PrintResponseData(字节[]数据)
{
var str=Encoding.UTF8.GetString(数据);
BookSource _sources=JsonConvert.DeserializeObject(str);
sourceDat.Add(_sources.ToString());
waitEvent.Set();
browser.Dispose();
//source.Add(_sources);
//返回源;
}
}
}
}
据我所知,不可能直接在WebBrowser中拦截AJAX响应。似乎有一种解决方法可以通过ObjectForScript拦截它:它很有效,非常感谢。我将研究ObjectForScript