发布的Net Core Web应用程序中ping类不起作用

4
我在Net Core Web API控制器中有一个非常简单的ping端点。它在本地工作正常。
[HttpGet("ping")]
    public IActionResult Ping()
    {

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

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

但在已发布的 Azure 应用程序上,当我访问该端点时,它返回 500 状态代码表示内部服务器错误。
我尝试添加一些 NuGet 包,使用异步,但结果总是相同 - 在本地工作正常,但发布后不行。
我还尝试检查 Azure 门户,也许他们的服务器会阻止 ping?
编辑:
从 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

编辑2:

我在Kudos中的调试控制台中检查了eventlog.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真的会阻止ping吗?


1
你没有任何错误日志吗?状态码500意味着“查看日志文件”。说实话,这可能有一千个原因,你应该在在SO上提问之前先查看日志文件。 - Daniel W.
感谢您的评论。我在我的问题中添加了日志。 - mm_archeris
1
你已经放入了堆栈跟踪,但没有实际的异常名称,是哪种异常被抛出了? - David C
我已经编辑了这个问题,并加入了一个异常(在eventlog.xml中找到)。感谢您指出。 - mm_archeris
1个回答

3
在Azure App Service上,由于安全限制,ping、nslookup和tracert工具无法通过控制台工作。但是,有两个单独的工具:为了测试DNS功能,您可以利用nameresolver.exe和Tcpping - 它允许您测试与主机和端口组合的TCP连接。
为了更详细地说明这一点,标准的Azure Web应用程序运行在一个称为沙箱的安全环境中。每个应用程序都在自己的沙箱中运行,将其执行与同一机器上的其他实例隔离开来,并提供额外的安全和隐私度,否则将不可用。在这种环境下,应用程序可以通过已公开的HTTP(80)和HTTPS(443)TCP端口通过互联网访问;应用程序不能侦听从互联网到达的其他端口的数据包。
除非同一沙箱中的另一个进程在目标端口上创建了侦听套接字,否则连接尝试到本地地址(例如localhost、127.0.0.1)和计算机自己的IP将失败。
请看这篇文章以获取更多关于这个主题的细节。从Kudu控制台,你可以执行tcpping www.google.com:80。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接