【问题标题】:how can i reduce memory usage on my application running on azure如何减少在 azure 上运行的应用程序的内存使用量
【发布时间】:2017-02-25 06:57:20
【问题描述】:

我正在学习如何使用 .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 免费托管服务

【问题讨论】:

  • 你能解释一下你想在你的网络应用程序中用DotNetBrowser做什么吗?
  • 应用程序与网站通信,当输入值时,网站正在通过一系列 Ajax 请求获取我的数据,然后 chromium 包装器通过 JavaScript 执行数据,然后使用结果发出另一个 Ajax 请求这一直持续到获得所需的数据。我不知道 httpclient 可以做到这一点。就我而言,当我收听 XHR 请求时……需要 4 次需要 XHR 请求才能获得我想要的数据。
  • 你没有在这个声明中清楚地解释你的目标是什么:我需要的数据在提供所需的值之前要经过多个服务器和客户端通信 --- 我们无法提供基于此的替代解决方案...
  • 我在原始帖子中解释了我的目标。我正在向 Den 解释我为什么使用 dotnetbrowser。我可以使用此方法获取所需的所有数据,并且在我的原始帖子中,我询问是否有任何替代方法可以这样做以及减少我的代码使用的内存。这就是我发布问题的原因。我所做的那句话解释了我使用 dotnetbrowser 而不是 httpclient 的原因。例如 stackoverflow 的网站会触发 ajax 请求以即时更新页面。 httpclient 无法与服务器进行 ajax 通信

标签: asp.net azure task dotnetbrowser


【解决方案1】:

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

分析方面,最好的办法是从 Application Insights - it's enabled by default in ASP.NET Core projects 开始。它将允许跨应用组件进行资源跟踪。

【讨论】:

  • 我将它用于我的 API。我收到的数据无法通过 httpclient 获取,因为数据来自多个来源的 Ajax 请求。我不知道我是否解释得很好,但例如。如果发出 Ajax 请求,如果可以获取浏览器可以通过 JavaScript 执行的数据,它们会将结果传递给另一个 Ajax 请求,直到获得所需的值。这就是我需要浏览器控件的原因。使用 httpwebrequest 或其他非浏览器控件的 Web 客户端只会下载 dom 文件,而不是执行 jquery 来获取所需的字符串或 JSON
  • 这应该是一个评论,而不是一个答案,因为它只是一个关于找出内存使用的建议,而不是一个根本原因的修复。
  • @Cody 你绝对可以通过HttpClient得到你想要的数据。在 Web 应用程序中使用 Chromium 包装器是绝对没有必要的。
  • 我对你有更多的期待,还是你正在努力?
  • @Cody 和“期待更多来自你”的意思究竟是什么?
【解决方案2】:

您似乎有不止一个正在运行的浏览器实例。

我可以建议检查 Browser 实例是否被正确处理。如果没有,可以尝试在控制器的 Dispose 方法中进行 dispose。

【讨论】:

  • 我将它设置为立即处理我需要的数据。但是您能否解释更多或告诉我如何运行多个浏览器实例。谢谢
猜你喜欢
  • 2010-09-28
  • 2020-12-24
  • 1970-01-01
  • 2018-03-06
  • 2010-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多