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

时间:2012-07-11 14:03:06

标签: 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时,如果遇到网络问题,我可以获得从 12000 12156 的值。我希望在我的C#应用​​程序中具有相同的功能,这样我至少可以将最少的信息写入日志并让计算机相应地执行操作。有什么想法吗?

3 个答案:

答案 0 :(得分:3)

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

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等。

答案 1 :(得分:1)

如果代码仅在您没有可用的网络连接时失败,则可以在执行代码之前使用GetIsNetworkAvailable()。此方法将返回一个布尔值,指示网络连接是否可用。如果返回false,则可以执行提前返回/通知用户,如果没有,则继续。

System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable()

使用您在上面提供的代码:

public static void GETRequest()
{
    if (!System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable())
        return; //or alert the user there is no connection

    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);
    }
}

答案 2 :(得分:1)

这应该对你有用,我之前已经多次使用它,根据你的需要减少一点: -

private static string GetStatusCode(string url)
{
      HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
      req.Method = WebRequestMethods.Http.Get;
      req.ProtocolVersion = HttpVersion.Version11;
      req.UserAgent = "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)";

      try
      {
         HttpWebResponse response = (HttpWebResponse)req.GetResponse();
         StringBuilder sb = new StringBuilder();

         foreach (string header in response.Headers)
         {
            sb.AppendLine(string.Format("{0}: {1}", header, response.GetResponseHeader(header)));
         }

         return string.Format("Response Status Code: {0}\nServer:{1}\nProtocol: {2}\nRequest Method: {3}\n\n***Headers***\n\n{4}", response.StatusCode,response.Server, response.ProtocolVersion, response.Method, sb);
       }
       catch (Exception e)
       {
          return string.Format("Error: {0}", e.ToString());
       }
}

随意忽略获取标题的部分