3

以前は、GETリクエストを送信して特定のWebサイトにアクセスできるかどうかをテストする小さなVBScriptを持っていました。スクリプト自体は非常にシンプルで、必要なことはすべて実行しました。

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#アプリでも同じ機能を使用したいのですが、そうすれば、少なくとも最小限の情報をログに書き込んで、それに応じてコンピューターを動作させることができます。何か案は?

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 に答える