如何减少在天蓝色

时间:2017-02-25 06:57:21

标签: asp.net azure task dotnetbrowser

我正在学习如何使用.NET框架。我正在使用ASP .NET核心。直到最近我一直没有达到或者达到了我的天蓝色虚拟主机配额,因为我提供了很少的请求,因为我安装了dotnetbrowser库,所以这一点开始了。它是我项目的最佳库,因为它使数据更容易。但是,如果有人能告诉我如何在不使用浏览器控件(如Web浏览器或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();

        }



    }

}
}

我可能做错了吗?如果是这样的话,如何改进以节省内存或数据呢?

更新:我正在使用azure免费托管服务enter image description here

2 个答案:

答案 0 :(得分:0)

DotNetBrowser是一个Chromium包装器 - 我不完全确定你为什么在Web应用程序中需要它,但是说,它很可能是它的罪魁祸首。删除后,您可以使用HttpClient执行正确的请求而无需内存开销。

分析,你最好的选择是从应用洞察开始 - it's enabled by default in ASP.NET Core projects。它将允许跨应用程序组件进行资源跟踪。

答案 1 :(得分:0)

好像你有多个正在运行的浏览器实例。

我可以建议检查浏览器实例是否正确处理。如果没有,您可以尝试将其置于控制器的Dispose方法中。