0

我有這個代碼運行在BackgroundWorker中,並且應該向服務器發出POST請求並獲得響應。當它應該工作時它工作正常,但是當我嘗試引發404錯誤時,它無法捕獲錯誤報告系統。C#請求不超時

loginProcess.DoWork += delegate(object s, DoWorkEventArgs args) 
      { 
       // loginProcess BackgroundWorker 

       try 
       { 
        // Try to login, if error, report 

        loginProcess.ReportProgress(10); 
        String method = "POST"; 
        String postdata = "postdata=test"; 
        String url = "http://localhost/dev/login.php"; 

        loginProcess.ReportProgress(15); 




        WebRequest rqst = HttpWebRequest.Create(url); 
        rqst.Timeout = 5000; 
        ((HttpWebRequest)rqst).KeepAlive = true; 

        loginProcess.ReportProgress(20); 


        //rqst.Timeout = this.Timeout; 
        // only needed, if you use HTTP AUTH 
        //CredentialCache creds = new CredentialCache(); 
        //creds.Add(new Uri(url), "Basic", new NetworkCredential(this.Uname, this.Pwd)); 
        //rqst.Credentials = creds; 
        rqst.Method = method; 
        if (!String.IsNullOrEmpty(postdata)) 
        { 
         //rqst.ContentType = "application/xml"; 
         rqst.ContentType = "application/x-www-form-urlencoded"; 
         loginProcess.ReportProgress(30); 

         byte[] byteData = UTF8Encoding.UTF8.GetBytes(postdata); 

         loginProcess.ReportProgress(40); 

         rqst.ContentLength = byteData.Length; 

         loginProcess.ReportProgress(50); 
         using (Stream postStream = rqst.GetRequestStream()) 
         { 


          loginProcess.ReportProgress(50); 
          postStream.Write(byteData, 0, byteData.Length); 
          loginProcess.ReportProgress(60); 
          postStream.Close(); 
          loginProcess.ReportProgress(70);  
          rqst.GetResponse().Close(); 
          rqst.GetRequestStream().Close(); 
         } 




        } 

        loginProcess.ReportProgress(90); 
        using (var response1 = rqst.GetResponse()) 
        { 
         using (var responseStream1 = response1.GetResponseStream()) 
         { 
          using (var reader1 = new StreamReader(responseStream1)) 
          { 
          //StreamReader rsps = new StreamReader(rqst.GetResponse().GetResponseStream()); 

          string strRsps = reader1.ReadToEnd(); 
          loginProcess.ReportProgress(95); 
          loginVars = strRsps; 

          //rqst. 
          //reader1.Close(); 
          //rsps.Dispose(); 
          } 

          args.Result = "SUCCESS"; 
         } 
        } 







       } 
       catch(WebException err) 
       { 
        // Catch error and put into err variable 

        if(err.Status == WebExceptionStatus.ProtocolError) 
        { 
         // If something is wrong with protocol 
         LoginReporting.ErrorName = Convert.ToString(((HttpWebResponse)err.Response).StatusCode); 
         LoginReporting.ErrorDescription = Convert.ToString(((HttpWebResponse)err.Response).StatusDescription); 
         LoginReporting.ErrorNotes = "Error when logging in, Server returned: " + Convert.ToString(((HttpWebResponse)err.Response).StatusCode); 
         LoginReporting.ErrorLocation = "LoginRequest.ProtocolError"; 

         args.Result = "ERROR"; 
         //MessageBox.Show(Convert.ToString(((HttpWebResponse)err.Response).StatusCode)); 
        //MessageBox.Show(Convert.ToString(((HttpWebResponse)err.Response).StatusDescription)); 
        } 
        else 
        { 
        args.Result = "ERROR"; 
        } 

       } 
       catch(Exception err) 
       { 
        // Catch unhandled error 

        LoginReporting.ErrorName = Convert.ToString(err); 
         LoginReporting.ErrorDescription = Convert.ToString(err.Message); 
         LoginReporting.ErrorNotes = "Error when logging in, Server returned: " + Convert.ToString(err.Message); 
         LoginReporting.ErrorLocation = "LoginRequest.ProtocolError"; 

        args.Result = "ERROR"; 

       } 
      }; 

我已經超時了請求,但它不起作用!這是一個錯誤,還是我在這裏做錯了什麼?

謝謝

+0

是「錯誤」是一樣的事情做錯了什麼? – 2010-12-21 19:41:27

回答

0

404仍然是從服務器響應客戶端的請求。你嘗試停止服務器,看看你的代碼是否捕獲到異常。

0

您關閉了rqst.GetResponse().Close();中的響應,然後嘗試使用rqst.GetResponse()訪問流。
只是評論出rqst.GetResponse().Close();,它應該工作...