Azure NotificationHubClient генерирует исключение SocketException при интенсивном использовании функции Azure - PullRequest
6 голосов
/ 27 марта 2020

Мы используем функцию Azure для отправки уведомлений pu sh через Azure NotificationHubClient. Эта функция часто вызывается в пиковые моменты времени в реальной среде, и в результате мы получили много исключений SocketException из метода NotificationHubClient.SendNotificationAsyn c ().

Сведения об исключении:

Microsoft.Azure.NotificationHubs.Messaging.MessagingException: Unexpected exception encountered TimeStamp:2020-03-27T04:14:35.4655705Z ---> System.Net.Http.HttpRequestException: Cannot assign requested address ---> System.Net.Sockets.SocketException: Cannot assign requested address
   at System.Net.Http.ConnectHelper.ConnectAsync(String host, Int32 port, CancellationToken cancellationToken)
   --- End of inner exception stack trace ---
   at System.Net.Http.ConnectHelper.ConnectAsync(String host, Int32 port, CancellationToken cancellationToken)
   at System.Threading.Tasks.ValueTask`1.get_Result()
   at System.Net.Http.HttpConnectionPool.CreateConnectionAsync(HttpRequestMessage request, CancellationToken cancellationToken)
   at System.Threading.Tasks.ValueTask`1.get_Result()
   at System.Net.Http.HttpConnectionPool.WaitForCreatedConnectionAsync(ValueTask`1 creationTask)
   at System.Threading.Tasks.ValueTask`1.get_Result()
   at System.Net.Http.HttpConnectionPool.SendWithRetryAsync(HttpRequestMessage request, Boolean doRequestAuth, CancellationToken cancellationToken)
   at System.Net.Http.RedirectHandler.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
   at System.Net.Http.DiagnosticsHandler.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
   at System.Net.Http.HttpClient.FinishSendAsyncBuffered(Task`1 sendTask, HttpRequestMessage request, CancellationTokenSource cts, Boolean disposeCts)
   at Microsoft.Azure.NotificationHubs.NotificationHubClient.SendRequestAsync(HttpRequestMessage request, String trackingId, HttpStatusCode[] successfulResponseStatuses, CancellationToken cancellationToken)
   --- End of inner exception stack trace ---
   at Microsoft.Azure.NotificationHubs.ExceptionsUtility.HandleUnexpectedException(Exception ex, String trackingId)
   at Microsoft.Azure.NotificationHubs.ExceptionsUtility.TranslateToMessagingException(Exception ex, Int32 timeoutInMilliseconds, String trackingId)
   at Microsoft.Azure.NotificationHubs.NotificationHubClient.SendRequestAsync(HttpRequestMessage request, String trackingId, HttpStatusCode[] successfulResponseStatuses, CancellationToken cancellationToken)
   at Microsoft.Azure.NotificationHubs.NotificationHubClient.SendNotificationImplAsync(Notification notification, String tagExpression, String deviceHandle, CancellationToken cancellationToken)

Мы создаем NotificationHubClient, например:

new NotificationHubClient(connectionString, hubName, new NotificationHubClientSettings { OperationTimeout = TimeSpan.FromSeconds(10) });

Я заметил, что реализация Microsoft создает новый HttpClient для каждого нового экземпляра NotificationHubClient, что, вероятно, будет проблемой. (хорошо известное истощение сокетов), но я понятия не имею, как с этим можно справиться.

Кто-нибудь сталкивался с такой же проблемой и сумел как-то ее исправить? Спасибо

Ответы [ 2 ]

0 голосов
/ 16 апреля 2020

В конце концов нам удалось преодолеть проблему, введя

    IHttpMessageHandlerFactory _httpMessageHandlerFactory;

в наш класс и передать его в messagesHubClient в конструкторе:

    return new NotificationHubClient(connectionString, hubName, 
    new NotificationHubClientSettings
    {
       OperationTimeout = TimeSpan.FromSeconds(10),
       MessageHandler = _httpMessageHandlerFactory.CreateHandler()
    });
0 голосов
/ 27 марта 2020

Существует RESTful API для центров уведомлений. Вы можете видеть это здесь . Если вам нужен больший контроль, вы можете написать свою собственную оболочку для нужных вам методов, убедившись, что экземпляр HttpClient установлен как переменная-член stati c в вашей функции Azure.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...