3

我以前有一个小型 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我能够获得从1200012156的值。我想在我的 C# 应用程序中拥有相同的功能,这样我至少可以将最少的信息写入日志并让计算机采取相应的行动。有任何想法吗?

4

3 回答 3

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_CONNECT或之类的错误代码12007 ERROR_WINHTTP_NAME_NOT_RESOLVED

于 2012-07-11T14:17:52.363 回答
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);
    }
}
于 2012-07-11T14:15:38.650 回答
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());
       }
}

随意忽略获取标题的部分

于 2012-07-11T14:16:08.713 回答