我之前有一个小的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#应用程序中具有相同的功能,这样我至少可以将最少的信息写入日志并让计算机相应地执行操作。有什么想法吗?
答案 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_CONNECT
或12007 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());
}
}
随意忽略获取标题的部分