HttpWebRequest& HttpWebResponse问题

时间:2012-02-04 10:47:17

标签: c# httpwebrequest httpwebresponse

我曾尝试使用HttpWebRequest&amp; amp; HttpWebResponse,它工作正常,但我有另一个问题,我想知道当服务器超时或断开连接,假设我的连接发生了什么事情,我断开连接我想知道如何在以下代码中理解这一点:< / p>

string uri = @"myUrl";
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
        request.Credentials = new NetworkCredential(User, Pass);
        ServicePointManager.ServerCertificateValidationCallback = ((sender, certificate, chain, sslPolicyErrors) => true);
        byte[] buf = new byte[10000];
        int count = -1;
        String read = "";
        HttpWebResponse response;
        //MessageBox.Show("OK");
        //response = (HttpWebResponse)request.GetResponse();
        //count = response.GetResponseStream().Read(buf, 0, buf.Length);
        //read = Encoding.UTF8.GetString(buf, 0, count);
        //MessageBox.Show(read + "SALAM");
        //while (true)
        //{
        response = (HttpWebResponse)request.GetResponse();
        //while (true)
        //{
        do
        {
            count = response.GetResponseStream().Read(buf, 0, buf.Length);
            read += Encoding.UTF8.GetString(buf, 0, count);
        } while (response.GetResponseStream().CanRead && count != 0);

        if (read != "")
        {
            // MessageBox.Show(read);
            XDocument xdoc = XDocument.Parse(read);

            //Filter EventXML
            var lv1s = from lv1 in xdoc.Descendants("event")
                       select new
                       {
                           Event_id = lv1.Attribute("id").Value,
                           Header = lv1.Attribute("name").Value,
                           Children = lv1.Descendants("argument")
                       };
            List<event_details> event_detail = new List<event_details>();


            foreach (var lv1 in lv1s)
            {
                if (lv1.Event_id == event_id)
                    foreach (var lv2 in lv1.Children)
                    {
                        event_details x = new event_details();
                        x.type = lv2.Attribute("type").Value;
                        x.value = lv2.Attribute("value").Value;
                        event_detail.Add(x);
                    }
            }
            //inja chun ke daram rooye MsgDGV ke ye k Datagridview minevisam bayad hatman az Invoke estefade konam
            // ta kharabkari nashe:P:D
            Point detail_point = new Point();
            detail_point.X = MsgDGV.Width / 2 + (this.Width - MsgDGV.Width) / 2;
            detail_point.Y = MsgDGV.Height / 2 + (this.Height - MsgDGV.Height) / 2;
            Details detail = new Details(event_detail, timestamp, EVENT, detail_point);
            detail.ShowDialog();
            event_details.Abort();
        }

3 个答案:

答案 0 :(得分:1)

当Request.GetResponse()方法调用Times Out时,您需要捕获调用WebException方法时引发的HttpWebRequest.GetResponse。 GetResponse()方法可以抛出四个异常,因此您需要检查抛出的异常类型或捕获您需要的特定异常类型,即:Catch(WebException ex){}。

请注意,您可以根据需要获取并设置WebRequest.Timeout属性。

// Set the 'Timeout' property in Milliseconds.
request.Timeout = 10000;

在您的代码中,您将包装HttpWebRequest.GetResponse()方法调用以及与Try-Catch块中的GetResponse()调用公开的数据相关的所有代码。 您还应该利用WebResponse实现IDisposable的事实,并使用using syntax来管理对象范围和生命周期,这样您就不会再引用不再需要的对象或范围。

try 
{
    using (WebResponse response = request.GetResponse())
    {
            // ALL OTHER CODE
    }
}
catch (Exception ex)
{
    // Handle Exception 
}

答案 1 :(得分:1)

其实我找到了方法!!,上面的两个答案在你从互联网断开连接或你的连接有问题时工作正常,它抛出一个例外,并按照上面指定的方式,我们可以解决它,但是当你连接并且在中间断开连接时,情况发生了变化。由于您已连接,因此您到达了:

response.GetResponseStream().Read(buf, 0, buf.Length);

然后它会卡在这个函数中然后为了读取你应该指定一个超时,所以C#得到了这个:

response.GetResponseStream().ReadTimeout = 1000;

所以在阅读之前你应该指定一个超时,然后一切正常;

答案 2 :(得分:0)

您可以捕获WebException以查看请求执行期间是否发生错误或请求已过期的超时期限:

try 
{
  using(var response = (HttpWebResponse)request.GetResponse())
  {

  }
}
catch(WebException e)
{
   //timeout or error during execution
}

另外,您可能需要检查响应状态是否等于200:

if(resp.StatusCode == 200)
{
  //code
}

有关HttpRequest的更多详细信息,您可以找到here