C# HttpWebRequest&;HttpWebResponse问题

C# HttpWebRequest&;HttpWebResponse问题,c#,httpwebrequest,httpwebresponse,C#,Httpwebrequest,Httpwebresponse,我曾尝试使用HttpWebRequest和HttpWebResponse连接到服务器,它工作正常,但我遇到了另一个问题,我想知道服务器何时超时或断开连接,假设我的连接发生了问题,我断开了连接,我想知道如何在以下代码中理解这一点: string uri = @"myUrl"; HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri); request.Credentials = new Netwo

我曾尝试使用HttpWebRequest和HttpWebResponse连接到服务器,它工作正常,但我遇到了另一个问题,我想知道服务器何时超时或断开连接,假设我的连接发生了问题,我断开了连接,我想知道如何在以下代码中理解这一点:

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();
        }
stringuri=@“myUrl”;
HttpWebRequest请求=(HttpWebRequest)WebRequest.Create(uri);
request.Credentials=新的网络凭据(用户,通过);
ServicePointManager.ServerCertificateValidationCallback=((发件人、证书、链、sslPolicyErrors)=>true);
字节[]buf=新字节[10000];
整数计数=-1;
字符串读取=”;
HttpWebResponse;
//MessageBox.Show(“OK”);
//response=(HttpWebResponse)request.GetResponse();
//count=response.GetResponseStream().Read(buf,0,buf.Length);
//read=Encoding.UTF8.GetString(buf,0,count);
//MessageBox.Show(读+“SALAM”);
//while(true)
//{
response=(HttpWebResponse)request.GetResponse();
//while(true)
//{
做
{
count=response.GetResponseStream().Read(buf,0,buf.Length);
read+=Encoding.UTF8.GetString(buf,0,count);
}while(response.GetResponseStream().CanRead&&count!=0);
如果(读!=“”)
{
//MessageBox.Show(读取);
XDocument xdoc=XDocument.Parse(读取);
//过滤事件XML
var lv1s=来自xdoc.substands(“事件”)中的lv1
选择新的
{
Event_id=lv1.Attribute(“id”).Value,
Header=lv1.Attribute(“name”).Value,
Children=1级。后代(“参数”)
};
列表事件_详细信息=新列表();
foreach(1级中的1级变量)
{
if(lv1.Event\u id==Event\u id)
foreach(1级中的变量lv2.Children)
{
事件_详情x=新事件_详情();
x、 type=lv2.Attribute(“type”).Value;
x、 value=lv2.属性(“value”).值;
事件详细信息。添加(x);
}
}
//inja chun ke daram rooye MsgDGV ke ye k Datagridview minevisam bayad hatman az estefade konam
//塔哈拉布卡里·纳什:P:D
点细节_点=新点();
详图_点X=MsgDGV.Width/2+(this.Width-MsgDGV.Width)/2;
详图_点Y=MsgDGV.Height/2+(this.Height-MsgDGV.Height)/2;
细节细节=新细节(事件细节、时间戳、事件、细节点);
detail.ShowDialog();
事件_details.Abort();
}

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

注意:您可以根据需要获取和设置属性

// Set the 'Timeout' property in Milliseconds.
request.Timeout = 10000;
在代码中,您可以将HttpWebRequest.GetResponse()方法调用和与GetResponse()调用公开的数据相关的所有代码包装在一个块中。 您还应该利用WebResponse实现IDisposable这一事实,并使用来管理对象范围和生存期,这样就不会留下对不再需要的对象或范围内对象的引用

try 
{
    using (WebResponse response = request.GetResponse())
    {
            // ALL OTHER CODE
    }
}
catch (Exception ex)
{
    // Handle Exception 
}
您可以捕获以查看在请求执行期间或请求过期的超时期间是否发生错误:

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

  }
}
catch(WebException e)
{
   //timeout or error during execution
}
此外,您可能需要检查响应状态是否等于200:

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

<关于HttpRequest的更多细节你可以找到

实际上我找到了方法!!上面的两个答案在你与互联网断开或者连接有问题的时候工作得很好,它抛出一个异常,用上面指定的方式,我们可以解决它,但是当你被连接到中间的时候,你会发现。ot断开连接情况发生了变化。因为您已连接,并且您到达:

response.GetResponseStream().Read(buf, 0, buf.Length);
然后它将卡在这个函数中,然后对于读取,您应该指定一个超时,以便C#得到以下结果:

response.GetResponseStream().ReadTimeout = 1000;

在读取之前,你应该指定一个超时,然后一切都很好;

当我的连接断开并尝试连接到服务器时,这是正常的,然后将抛出异常,但是当我连接到服务器,在中间,我关掉我的无线,也不例外是扔…我想知道为什么我T不工作!当我的连接断开并尝试连接到服务器时,这是正常的,然后将抛出异常,但是当我连接到服务器,在中间,我关掉我的无线系统,也不例外是扔…我不知道为什么它不工作!