C# Azure功能连接监视

C# Azure功能连接监视,c#,azure,sockets,connection,azure-functions,C#,Azure,Sockets,Connection,Azure Functions,我的函数应用程序经常使用大量HTTP请求。所以我在下面出现了一个错误 Only one usage of each socket address is normally permitted 功能应用程序将立即自动关闭几分钟。我对此进行了搜索,并了解到在每个restSharp请求中打开一个新连接会导致这种情况。更好的解决方案是只以静态方式打开一个HttpClient。因此,我更改了函数,对所有请求使用静态HttpClient 现在我想知道这个改变是否有效。我在azure matrics中检查了连

我的函数应用程序经常使用大量HTTP请求。所以我在下面出现了一个错误

Only one usage of each socket address is normally permitted
功能应用程序将立即自动关闭几分钟。我对此进行了搜索,并了解到在每个restSharp请求中打开一个新连接会导致这种情况。更好的解决方案是只以静态方式打开一个HttpClient。因此,我更改了函数,对所有请求使用静态HttpClient

现在我想知道这个改变是否有效。我在azure matrics中检查了连接,但它总是显示计数“30”。但在RestSharp的案例中也是如此。有人请帮我理解分析连接图。 看到图片了吗


非常感谢您提供的任何帮助。

就错误消息而言,如果您只有30个连接,根据文章,这不应该是一个问题,除非您在中将某些配置设置为30

在创建HttpClient的静态实例时,如果尚未使用,则可以使用DI在
函数启动中插入
HttpClient的单例实例-

using Microsoft.Azure.Functions.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection;

[assembly: FunctionsStartup(typeof(MyNamespace.Startup))]

namespace MyNamespace
{
    public class Startup : FunctionsStartup
    {
        public override void Configure(IFunctionsHostBuilder builder)
        {
            builder.Services.AddSingleton<IHttpClient, HttpClient>();
        }
    }
}
使用Microsoft.Azure.Functions.Extensions.DependencyInjection;
使用Microsoft.Extensions.DependencyInjection;
[程序集:函数启动(typeof(MyNamespace.Startup))]
名称空间MyNamespace
{
公共类启动:函数启动
{
公共覆盖无效配置(IFunctionsHostBuilder)
{
builder.Services.AddSingleton();
}
}
}
然后,使用您的客户机,如下所示:

using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.Extensions.Logging;
using System.Net.Http;
using System.Threading.Tasks;

namespace MyNamespace
{
    public class MyHttpTrigger
    {
        private readonly IHttpClient _client;

        public MyHttpTrigger(IHttpClient httpClient)
        {
            this._client = httpClient;
        }

        [FunctionName("MyHttpTrigger")]
        public async Task<IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req,
            ILogger log)
        {
            var response = await _client.GetAsync("https://microsoft.com");    
            return new OkObjectResult("Response from function with injected dependencies.");
        }
    }
}
使用Microsoft.AspNetCore.Http;
使用Microsoft.AspNetCore.Mvc;
使用Microsoft.Azure.WebJobs;
使用Microsoft.Azure.WebJobs.Extensions.Http;
使用Microsoft.Extensions.Logging;
使用System.Net.Http;
使用System.Threading.Tasks;
名称空间MyNamespace
{
公共类MyHttpTrigger
{
专用只读IHttpClient\u客户端;
公共MyHttpTrigger(IHttpClient httpClient)
{
这个。_client=httpClient;
}
[函数名(“MyHttpTrigger”)]
公共异步任务运行(
[HttpTrigger(AuthorizationLevel.Function,“get”,“post”,Route=null)]HttpRequest请求,
ILogger日志)
{
var response=wait_client.GetAsync(“https://microsoft.com");    
返回新的OkObjectResult(“来自具有注入依赖项的函数的响应”);
}
}
}
有关完整实施和其他详细信息,您可以访问-

编辑: 有关Azure应用程序服务计划指标的信息,请参阅文档

这取决于您将HttpClient设置为静态的级别,对于单例场景,建议始终使用DI

根据功能应用程序的设计。我不确定第一个图形是否正确,因为它不反映聚合。第二个图表显示了沙盒(w3wp.exe及其子进程)中存在的绑定套接字的平均数量,正如您所提到的,我知道在您的函数应用程序中有大量的出站Http请求,并且它们正在逐渐增加,如果是在出站请求最多的情况下(如图所示为137),那么你的Azure函数应用程序的图表看起来不错。请注意,如果您的出站Http请求超出这些限制,那么您必须重新设计Function App,使其将连接保持在这些限制内


如果您想在将来更深入地挖掘,您可以参考文档了解有关Azure Function App Sandbox的详细信息。本文件由PG定期维护。

您正在绘制长期平均费率图。大多数请求持续很短的时间(秒),因此查看小时数并不能给出任何改进的实际静态数据。@jdweng我检查了30分钟的时间,我可以看到连接图显示30到100之间。但我可以看到,平均每次连接数都在逐渐增加。这是为什么。这将导致套接字连接再次出现问题。请使用cmd.exed>Netstat-a,它将提供当前的连接,并看到连接实际上在增加。@jdweng我们可以在azure函数中运行此命令吗。?请参见以下内容:Hi@harshitasingh msft。是的,您是对的,30连接不会导致插座耗尽问题。我没有设置任何连接限制。但我可以看到,当我将图形绘制改为平均值时,图形的数量增加了。目前,我没有使用函数模板。但我希望创建单个HttpClient也类似于注入HttpClient的singleton实例。我刚刚添加了另一个图表,你能检查一下吗。当我使用restSharp或静态HttpClient时,这个增量没有区别。这是正常行为还是会导致连接耗尽问题。您选择了哪个托管计划?应用程序服务计划-Standard@SumithJose,如果此回复回答了您的问题,请将其标记为社区参考答案。