【问题标题】:How to check that a local URL is reachable如何检查本地 URL 是否可访问
【发布时间】:2016-10-17 12:55:41
【问题描述】:

我正在本地机器上部署 docker 容器。我检查它们是否成功部署的方法是转到我的浏览器并输入http://192.168.99.105:7474/browser。我想以编程方式执行此操作,因此我遵循了此问题Check if a url is reachable - Help in optimizing a Class 中的代码。然而,当我尝试它时,我得到了一个System.Net.WebException {"The remote server returned an error: (504) Gateway Timeout."}

它工作正常,如果网址是https://en.wikipedia.org/wiki/YouTube,我会得到一个HttpStatusCode.OK

这是我的代码:

private bool UrlIsReachable(string url)
    {
        //https://en.wikipedia.org/wiki/YouTube
        HttpWebRequest request = WebRequest.Create("http://192.168.99.105:7474/browser") as HttpWebRequest;
        request.Timeout = 600000;//set to 10 minutes, includes time for downloading the image
        request.Method = "HEAD";

        try
        {
            using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
            {
                return response.StatusCode == HttpStatusCode.OK;
            }
        }
        catch (WebException)
        {
            return false;
        }
    }

编辑:我的 docker-compose.yml 文件

version: '2'
services:
  company1:
    image: neo4j
    ports: 
         - "7474:7474"
         - "7687:7687"
    volumes:
         - $HOME/company1/data:/data
         - $HOME/company1/plugins:/plugins

  company2:
    image: neo4j
    ports: 
         - "7475:7474"
         - "7688:7687"
    volumes:
         - $HOME/company2/data:/data
         - $HOME/company2/plugins:/plugins

【问题讨论】:

  • 你有一些代理设置吗?
  • 你是如何启动你的 Docker 容器的?请给出命令或 docker-compose 文件。 192 地址是你主机的本地网络地址,还是运行 Docker 的 VM 的地址?
  • @lordkain 不,我没有,但我认为这是TCP 而不是HTTP。我在web-sniffer.net 网站上进行了测试,它给了我Only ports 80,443,8080 allowed. 我的端口是 7474。
  • @NathanielWaisbrot 是虚拟机的地址。
  • 您是从 VM(Docker 主机)还是在另一个容器内运行此代码?

标签: c# url docker docker-container


【解决方案1】:

您的代码很好,但最好使用新的Microsoft.Net.Http NuGet 包,它全是异步的并且支持 .NET Core。

您的代码所做的与浏览器所做的唯一区别是请求中的 HTTP 方法。浏览器发送GET,但您明确使用HEAD。如果您只想测试连接性,这是最有效的方法 - 但服务器可能不支持 HEAD 请求(我不太了解 neo4j,无法确定)。

尝试在您的代码中改用 GET 请求 - 此示例使用新的异步方法:

    [TestMethod]
    public async Task TestUrls()
    {
        Assert.IsTrue(await UrlIsReachable("http://stackoverflow.com"));
        Assert.IsFalse(await UrlIsReachable("http://111.222.333.444"));
    }

    private async Task<bool> UrlIsReachable(string url)
    {
        try
        {
            using (var client = new HttpClient())
            {
                var response = await client.GetAsync(url);
                return response.StatusCode == HttpStatusCode.OK;
            }
        }            
        catch 
        {
            return false;
        }
    }

自动化测试的最简单方法是使用 PowerShell,而不是编写自定义应用程序:

Invoke-WebRequest -Uri http://stackoverflow.com -UseBasicParsing

或者,如果您确定支持 HEAD

Invoke-WebRequest -Uri http://stackoverflow.com -Method Head -UseBasicParsing

【讨论】:

  • 如果我包含端口,这会正常工作吗?例如Assert.IsFalse(await UrlIsReachable("http://111.222.333.444:7474"));,因为我在 1 个主机中有 2 个端口
  • 是的,您可以在 URL 字符串中包含端口。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-30
  • 2011-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-28
  • 2013-11-20
相关资源
最近更新 更多