Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 如何减少azure上运行的应用程序的内存使用_Asp.net_Azure_Task_Dotnetbrowser - Fatal编程技术网

Asp.net 如何减少azure上运行的应用程序的内存使用

Asp.net 如何减少azure上运行的应用程序的内存使用,asp.net,azure,task,dotnetbrowser,Asp.net,Azure,Task,Dotnetbrowser,我正在学习如何使用.NET框架。我正在使用ASP.NETCore。我从未拥有或达到过我的azure webhosting配额,直到最近,我一直通过很少的请求来达到配额,这是从我安装dotnetbrowser库开始的。它是我的项目最好的库,因为它使获取数据更容易。不过,如果有人能告诉我如何在不使用web浏览器或dotnetbrowser等浏览器控件的情况下获取相同的数据,我将不胜感激。在提供所需的值之前,我需要的数据经过多个服务器和客户端通信。所以我的问题是,如何在不使用浏览器控件的情况下实现相同

我正在学习如何使用.NET框架。我正在使用ASP.NETCore。我从未拥有或达到过我的azure webhosting配额,直到最近,我一直通过很少的请求来达到配额,这是从我安装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();

        }



    }

}
}
使用dotnebrowser;
使用Newtonsoft.Json.Linq;
使用System.Collections.Generic;
使用系统文本;
使用System.Text.RegularExpressions;
使用系统线程;
使用System.Web;
使用System.Web.Http;
命名空间AjaxRequest.Controllers
{
公共类值控制器:ApiController
{
私有静态手动重置事件等待事件;
私有静态列表ajaxURL=new List();
静态字符串str=“”;
公共静态浏览器;
公共价值控制人()
{
waitEvent=新手动重置事件(false);
browser=BrowserFactory.Create();
browser.Context.NetworkService.ResourceHandler=新的AjaxResourceHandler();
browser.Context.NetworkService.NetworkDelegate=新的AjaxNetworkDelegate();
}
//获取api/值
公共字符串Get(int-id,字符串标题)
{
字符串Title=Title.Replace(“,“-”);
browser.LoadURL(string.Format(“https://ba.com/foo/{0}-{1}/something.html“,Title,id));
waitEvent.WaitOne();
browser.Dispose();
字符串Json=Regex.Replace(str,@“\\”,“”);
返回Json.Replace(“\\\”,“\”);
}
公共类AjaxResourceHandler:ResourceHandler
{
//家庭控制器hc;
公共bool CanLoadResource(ResourceParams参数)
{
if(parameters.ResourceType==ResourceType.XHR&¶meters.URL.Contains()https://something.com/ajax/blahblah"))
{
添加(parameters.URL);
}
返回true;
}
}
公共类AjaxNetworkDelegate:DefaultNetworkDelegate
{
//家庭控制器hc;
公共覆盖无效OnDataReceived(DataReceivedParams参数)
{
if(ajaxUrls.Contains(parameters.Url))
{
PrintResponseData(参数、数据);
}
}
public void PrintResponseData(字节[]数据)
{
str=Encoding.UTF8.GetString(数据);
ajaxURL.Clear();
browser.Stop();
browser.dispose();
waitEvent.Set();
}
公共无效错误(字符串信息)
{
str=信息;
waitEvent.Set();
}
}
}
}
有可能我做错了吗?如果是这样,如何改进以节省内存或数据


更新:我正在使用azure免费托管服务

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


从分析角度看,最好从应用程序洞察开始。它将允许跨应用程序组件跟踪资源。

看起来您有多个正在运行的浏览器实例


我可以建议检查浏览器实例是否正确处理。如果没有,您可以尝试使用控制器的dispose方法来处理它。

您能否解释一下您在web应用程序中使用
dotnebrowser
的具体操作方法?该应用程序与网站进行通信,当值被输入网站时,我从中获取数据通过一系列Ajax请求,然后chromium包装器通过JavaScript执行数据,然后发出另一个Ajax请求,其结果将继续,直到获得所需的数据。我不知道httpclient能做到这一点。在我的例子中,当我听XHR请求时。。。我需要4个require XHR请求才能得到我想要的数据。你没有在这句话中清楚地解释你的目标是什么:我需要的数据在提供所需的价值之前经过多个服务器和客户端的通信---我们无法帮助提供基于此的替代解决方案……我在原始帖子中解释了我的目标。我正在向Den解释我为什么使用dotnetbrowser。我可以用这个方法获得我所需要的所有数据,在我最初的帖子中,我问是否有其他方法可以做到这一点,以及减少代码使用的内存。这就是我发布这个问题的原因。我所做的这一陈述解释了我选择dotnetbrowser而不是httpclient的原因。例如,网站stackoverflow会发出ajax请求来动态更新页面。httpclient无法与服务器进行ajax通信,我正在将其用于API。我收到的数据无法通过httpclient获得,因为数据来自来自多个源的Ajax请求。我不知道我是否解释得很好,但例如,如果提出了一个Ajax请求,如果能够获得浏览器可以通过JavaScript执行的数据,他们会将结果传递给另一个Ajax请求,直到获得所需的值。这就是为什么我需要一个浏览器控件。使用httpwebrequest或其他非浏览器控件的web客户端只需下载dom文件,而不是执行jquery来获取所需的字符串或json这应该是一个注释,而不是答案,因为它只是一个计算内存使用情况的建议,不是根本原因修复。@Cody您完全可以通过
HttpClie获得所需的数据