0

httpwebrequest例外に問題があります。次のコードを使用してリクエストを行い、例外をキャッチします。

try
{    
    Uri url= new Uri("https://www.example.com");
    HttpWebRequest request2 =(HttpWebRequest)WebRequest.Create(url);

    request2.Timeout = 10000;

    HttpWebResponse response2 = (HttpWebResponse)request2.GetResponse();
    response2.Close();
}
catch (TimeoutException)
{
    listBox.Items.Insert(0, "Timeout");
}
catch (WebException ex)
{
    using (WebResponse response = ex.Response)
    {
        HttpWebResponse httpResponse = (HttpWebResponse)response;
        listBox.Items.Insert(0, "Status code(Benchmark):" + httpResponse.StatusCode);
    }
}
catch
{
    listBox.Items.Insert(0, "Failure");
}

www.oiuahsdupiasduiuhid.comなどの存在しないURLを入力すると、会社のネットワークで; webexceptionをスローします。ステータスコードが見つかりません:見つからないか、サービスを利用できません。ただし、自宅で試してみても例外はありません。約1秒待ってから、エラーなしで動作を停止します。何が起こっているかを確認するためにすべての例外を削除しますが、問題はエラーが表示されないことです。何が問題なのか分かりますか?

または、推奨事項はありますが、この問題を別の方法で処理するにはどうすればよいですか?

4

2 に答える 2

0

アプリケーションの設計、特にコール スタックの上位にある例外処理について詳しく知らなければ、自宅にいるときと同じように動作する理由を説明するのは困難です。

しかし、あなたの正確なコードを試したところ、 がスローされましたが、 nullであるためWebException、 がhttpResponse.StatusCodeスローされました。この例外をコール スタックのさらに上に飲み込んでいる可能性がある場合は、発生している状況を説明できる可能性があります。NullReferenceExceptionhttpResponse

httpResponseWebException特にタイムアウトのシナリオでは、リクエストが応答を受信しなかったため、多くの場合 null になります。

をキャストする前に、プロパティWebException.Responseを確認する必要がありWebException.Statusます。そのステータスが応答を受信したことを示している場合は、 checkWebException.Responseに進むことができます。それ以外の場合は null になります。次のようなものを試してください:

if(e.Status == WebExceptionStatus.ProtocolError) {
    listBox.Items.Insert("Status Code : {0}", 
       ((HttpWebResponse)e.Response).StatusCode);
}
else
{
    listBox.Items.Insert("Status : {0}", ex.Status);
}

補足として、例外がスローresponse2.Close();されたときに呼び出されることはないHttpWebResponse response2 = (HttpWebResponse)request2.GetResponse();ため、using ブロックでラップする必要があります。

using(HttpWebResponse response2 = (HttpWebResponse)request2.GetResponse())
{
    // do something with response
}
于 2012-11-08T09:34:09.997 に答える
0

psubsee2003 に感謝します。私は答えを得ました。これが正しく機能している私のコードです。以下のコードを webexception に追加しました。

if (ex.Status == WebExceptionStatus.ProtocolError)

 {
   using (WebResponse response = ex.Response)

{
   HttpWebResponse httpResponse = (HttpWebResponse)response;
   listBox2.Items.Insert(0, "Status:" + httpResponse.StatusCode);

}
 }

else
{
   listBox2.Items.Insert(0, "Status: " + ex.Status);
 }
于 2012-11-08T10:05:32.043 に答える