c# - 在 C# 中发送 http 请求并捕获网络问题

标签 c# http

我以前有一个小的 VBScript,它可以通过发送 GET 请求来测试特定网站是否可以访问。脚本本身非常简单,可以完成我需要的一切:

Function GETRequest(URL) 'Sends a GET http request to a specific URL
   Dim objHttpRequest

   Set objHttpRequest = CreateObject("MSXML2.XMLHTTP.3.0")
   objHttpRequest.Open "GET", URL, False

   On Error Resume Next 'Error checking in case access is denied
   objHttpRequest.Send

   GETRequest = objHttpRequest.Status
End Function

我现在想在扩展的 C# 应用程序中包含此类功能。但是,我一直无法获得与我之前提供的脚本相同的结果。

使用类似于我在下面发布的代码可以获得正确的结果,但如果我的网络连接失败则无法运行。

public static void GETRequest()
{
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://url");
    request.Method = "GET";
    HttpStatusCode status;
    HttpWebResponse response;
    try
    {
       response = (HttpWebResponse)request.GetResponse();
       status = response.StatusCode;
       Console.WriteLine((int)response.StatusCode);
       Console.WriteLine(status);
    }
    catch (WebException e)
    {
       status = ((HttpWebResponse)e.Response).StatusCode;
       Console.WriteLine(status);
    }
}

但正如我所说,我需要知道站点是否可以访问,而不管原因是什么:门户可能已关闭,或者问题可能出在尝试访问它的 PC 端。不管怎样:我不在乎。

当我在脚本中使用 MSXML2.XMLHTTP.3.0 时,如果我有网络问题。我希望在我的 C# 应用程序中具有相同的功能,这样我至少可以将最少的信息写入日志并让计算机采取相应的行动。有什么想法吗?

最佳答案

您的代码的直接翻译应该是这样的:

static void GetStatusCode(string url)
{
    dynamic httpRequest = Activator.CreateInstance(Type.GetTypeFromProgID("MSXML2.XMLHTTP.3.0"));
    httpRequest.Open("GET", url, false);

    try     { httpRequest.Send(); }
    catch   { }
    finally { Console.WriteLine(httpRequest.Status); }
}

它与您的 VBScript 脚本一样小而简单,并使用相同的 COM 对象发送请求。

这段代码很高兴地给我错误代码,如 12029 ERROR_WINHTTP_CANNOT_CONNECT12007 ERROR_WINHTTP_NAME_NOT_RESOLVED

关于c# - 在 C# 中发送 http 请求并捕获网络问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11434408/

相关文章:

C# Azure上传文件错误指定的blob或 block 内容无效

java - 限制 JBoss 上 HTTP post 请求的大小

c - 在本地 http 服务器上支持 keep-alive 套接字的问题

java - 在 Android 应用程序中检查互联网连接

javascript - 如何防止仅针对网站图标的 HTTP 请求?

c# - 为什么同时存在 System.Net.Http 和 System.Web.Http 命名空间?

c# - 高效读取和剪切文件的方法

C# 按位加法和减法,就像在 C 中一样

c# - 在 “using” block 中是关闭的 OracleConnection

http - 如何在 Flutter 移动应用程序的 API 调用中传递基本身份验证凭据?