Класс ping не работает в опубликованном базовом веб-приложении net - PullRequest
2 голосов
/ 22 января 2020

У меня очень простая конечная точка ping в net основном веб-контроллере API. Он работает локально.

[HttpGet("ping")]
    public IActionResult Ping()
    {

        string host = "www.google.com";
        Ping servicePing = new Ping();
        var reply = servicePing.Send(host);

        return Ok($"{reply.Status}");
    }

Но в опубликованном Azure приложении, когда я go к этой конечной точке, он возвращает 500 кодов состояния для внутренней ошибки сервера.

Я попытался добавить некоторые пакеты самородков, использующие asyn c, но они всегда одинаковы - работают локально, но не при публикации.

Я также пытался зарегистрироваться на портале Azure, может, их серверы блокируют пинг?

edit:

из Azure Отчет о диагностике службы приложений портала:

at System.Net.NetworkInformation.Ping.InitialiseIcmpHandle
at System.Net.NetworkInformation.Ping.DoSendPingCore
at System.Net.NetworkInformation.Ping.GetAddressAndSend
at System.Net.NetworkInformation.Ping.GetAddressAndSend
at System.Net.NetworkInformation.Ping.Send
at TestApi.Controllers.WeatherForecastController.Ping
at Microsoft.AspNetCore.Mvc.Infrastructure.ActionMethodExecutor.TaskOfIActionResultExecutor.Execute
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeActionMethodAsync>g__Awaited|12_0
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeNextActionFilterAsync>g__Awaited|10_0
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Rethrow
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeInnerFilterAsync
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeFilterPipelineAsync>g__Awaited|19_0
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Awaited|17_0
at Microsoft.AspNetCore.Routing.EndpointMiddleware.<Invoke>g__AwaitRequestTask|6_0
at Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke
at Microsoft.AspNetCore.Server.IIS.Core.IISHttpContextOfT`1.ProcessRequestAsync

edit 2:

Я проверил консоль отладки в Kudos на предмет журнала событий. xml файл, чтобы найти исключение. (Скажите, пожалуйста, есть ли лучший способ проверить наличие исключений на сервере?)

Вот фактическое исключение:

System.Net.NetworkInformation.PingException: An exception occurred during a Ping request.
 ---> System.ComponentModel.Win32Exception (5): Access is denied.
   at System.Net.NetworkInformation.Ping.InitialiseIcmpHandle()
   at System.Net.NetworkInformation.Ping.DoSendPingCore(IPAddress address, Byte[] buffer, Int32 timeout, PingOptions options, Boolean isAsync)
   at System.Net.NetworkInformation.Ping.GetAddressAndSend(String hostNameOrAddress, Int32 timeout, Byte[] buffer, PingOptions options)
   --- End of inner exception stack trace ---
   at System.Net.NetworkInformation.Ping.GetAddressAndSend(String hostNameOrAddress, Int32 timeout, Byte[] buffer, PingOptions options)
   at System.Net.NetworkInformation.Ping.Send(String hostNameOrAddress, Int32 timeout, Byte[] buffer, PingOptions options)
   at System.Net.NetworkInformation.Ping.Send(String hostNameOrAddress)
   at TestApi.Controllers.WeatherForecastController.Ping() in C:\Users\Dellas\source\repos\TestApi\TestApi\Controllers\WeatherForecastController.cs:line 48

Какой здесь обходной путь? Azure действительно блокирует пинг?

1 Ответ

1 голос
/ 23 января 2020

Да, в Azure Служба приложений, инструменты ping, nslookup и tracert не будут работать через консоль из-за ограничений безопасности. Однако есть два отдельных инструмента: для тестирования функциональности DNS можно использовать nameresolver.exe и Tcpping, что позволяет проверять TCP-подключение к комбинации хоста и порта.

Чтобы выделить более подробную информацию о стандартное Azure веб-приложение работает в защищенной среде, называемой песочницей. Каждое приложение запускается внутри собственной изолированной программной среды, изолируя его выполнение от других экземпляров на том же компьютере, а также обеспечивая дополнительную степень безопасности и конфиденциальности, которые в противном случае были бы недоступны. В этой среде единственный доступ к приложению через inte rnet возможен через уже выставленные порты HTTP (80) и HTTPS (443); приложения могут не прослушивать на других портах пакеты, поступающие с inte rnet.

Попытки подключения к локальным адресам (например, localhost, 127.0.0.1) и собственный IP-адрес компьютера не будет выполнен, за исключением случаев, когда другой процесс в Эта же песочница создала прослушивающий сокет на порту назначения.

Посмотрите эту статью для получения более подробной информации об этой топике c. С консоли Kudu вы можете выполнить tcpping www.google.com: 80

...