检查网址的HTTP状态码

检测网址的HTTP状态码(定制版) 1


背景

前天有群友问:如何获取文本文件中的网址的状态码,我以为用Get-Content和Invoke-WebRequest就够了,没想到,Invoke-WebRequest还有它矫情的一面,比如当遇到德高望重的方校长时,它不会返回404,而是直接报错,即使指定ErrorAction,也无济于事。

比如:

PS C:\> Invoke-WebRequest https://www.pstips.net/love -ErrorAction SilentlyContinue
Invoke-WebRequest : 远程服务器返回错误: (404) 未找到。
所在位置 行:1 字符: 1
+ Invoke-WebRequest https://www.pstips.net/love -ErrorAction SilentlyContinue
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest],WebExce
    ption
    + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand

这很让人怀疑,这是不是Invoke-WebRequest的一个bug,事实上不是,而是by design,因为在.NET中,WebRequest和HttpWebRequest的表现都是一样。并且,Invoke-WebRequest并没有给任何人承诺过,它可以返回所有请求的状态码。只是我们可能自作多情了。既然Invoke-WebRequest,关上了这一扇门,那它打开的另一扇窗户是什么?就是上面抛出的异常:System.Net.WebException

知识点

  • 所以我们只需要捕获异常中的WebException,针对它的属性Response.StatusCode进行处理即可。
  • 在使用Invoke-WebRequest时,可以指定Method为HEAD,这样就只返回Header部分信息,不返回body,可以提高效率。
  • 根据我的测试,当服务器返回状态码为100时,没有Response,所以单独处理。

脚本实现

Function Detect-HttpStatusCode ([uri]$Url)
{
    trap [Net.WebException]
    {
        if($_.Exception.Response -eq $null)
        {
            return 100
        }
        return [int]($_.Exception.Response.StatusCode)
    }
    return (Invoke-WebRequest $Url ).StatusCode
}

测试

既然是私人定制版,要测就测个全套的,将所有HTTP状态码全部测一遍。下面是我的步骤:

Web端

我自己新建了一个ASP.NET MVC工程。添加了一个控制器HTTP,里面放了一个Action叫Test,具体是这样写的:

public class HTTPController : Controller
{
    //
    // GET: /HTTP/

    public ActionResult Index()
    {
        return View();
    }
    public ActionResult Test(int id)
    {
        Response.StatusCode = id;
        Response.End();
        return View();
    }
}

客户端

如果对此无异议,我把该网站部署在本地42833端口,使用下面脚本测试:

[Enum]::GetNames([Net.httpStatusCode]) | foreach { 
    $expectedCode = [int][net.httpstatuscode]$_
    $actualCode = Detect-HttpStatusCode -Url "http://localhost:42833/http/test/$expectedCode"
    Write-Host  "$($_) -> $actualCode `t" -NoNewline
    if($expectedCode -eq $actualCode)
    {
        Write-Host '[Passed]' -ForegroundColor Green
    }
    else
    {
        Write-Host "[Failed]" -ForegroundColor Red
    } 
}

下面的输出,就用一张图来说明吧!

检查网址的HTTP状态码

检查网址的HTTP状态码

本文链接: https://www.pstips.net/detect-httpstatuscode.html
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!

关于 Mooser Lee

我是一个Powershell的爱好者,创建了PowerShell中文博客,热衷于Powershell技术的搜集和分享。本站部分内容来源于互联网,不足之处敬请谅解,并欢迎您批评指正。

发表评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注

一条评论 “检测网址的HTTP状态码(定制版)