Continuar después de la respuesta HTTPWEBREQUEST DEVOLUCIONES 404 ERROR -- # campo con rest campo con httpwebresponse camp Relacionados El problema

Continue after HttpWebRequest response returns 404 error


1
vote

problema

Español

Necesito determinar si una lista de usuarios está en un directorio de usuario de terceros. Estoy escribiendo el método en C # .NET 4.0. La lista de usuarios es más de 2700 entradas. La API para acceder a este directorio de usuario utiliza REST para devolver la información del usuario. Si el usuario no está en el directorio, la respuesta al HTTPWEBREQUEST es un error 404. Coge el error de la concepción de WebException.

El problema es que solo puedo obtener la información del usuario para 1 usuario a la vez, así que me gustaría hacer un bucle para ir a través de la lista de usuarios. Sin embargo, cuando se produce el error 404, se rompe del bucle. ¿Hay alguna manera de capturar el error 404 y continuar con el bucle con el siguiente usuario?

Este es mi código:

      public void GetRecipientDataFromCortext() {     SqlConnection SqlConn = null;     CortextUser objCortextResult;     try     {         string strStoredProcedure = "PagingToolGetRecipientsAndDevices";         DataTable tdtRecipientData = new DataTable("RecipientData");         //Create a datatable to store final results         DataTable tdtCortextResultData = new DataTable("CortextResults");         tdtCortextResultData.Columns.Add("RecipientID", typeof(int));         tdtCortextResultData.Columns.Add("DeviceTypeID", typeof(int));         tdtCortextResultData.Columns.Add("DeviceAddress", typeof(string));         tdtCortextResultData.Columns.Add("CUID", typeof(string));         tdtCortextResultData.Columns.Add("InviteStatus", typeof(string));         tdtCortextResultData.Columns.Add("IsEnabled", typeof(bool));         tdtCortextResultData.Columns.Add("FirstName", typeof(string));         tdtCortextResultData.Columns.Add("LastName", typeof(string));         tdtCortextResultData.Columns.Add("MiddleName", typeof(string));         tdtCortextResultData.Columns.Add("HonorificPrefix", typeof(string));         tdtCortextResultData.Columns.Add("HonorificSuffix", typeof(string));         tdtCortextResultData.Columns.Add("Email", typeof(string));         tdtCortextResultData.Columns.Add("Mobile", typeof(string));         tdtCortextResultData.Columns.Add("Pager", typeof(string));          string strSqlConnection = ConfigurationManager.ConnectionStrings[CONNECTION_STRING].ConnectionString;         //Get the recipient list from the database         using (SqlConn = new SqlConnection(strSqlConnection))         {             using (SqlCommand SqlCmd = new SqlCommand(strStoredProcedure, SqlConn))             {                 SqlCmd.CommandType = CommandType.StoredProcedure;                 SqlConn.Open();                 using (SqlDataAdapter dataReturned = new SqlDataAdapter(SqlCmd))                 {                     dataReturned.Fill(tdtRecipientData);                                          }             }         }         //For loop to make a call to cortext to get properties of this device          string tstrPropertyValue = string.Empty;         string tstrProperty = string.Empty;         int tiDeviceTypeID;         int tiRecipientID;          //This is the for loop to check each recipient to see if he/she is in the directory         foreach (DataRow row in tdtRecipientData.Rows)         {                            tstrPropertyValue = row["Address"].ToString();             tiDeviceTypeID = Convert.ToInt32(row["DeviceTypeID"].ToString());             tiRecipientID = Convert.ToInt32(row["RecipientID"].ToString());              //Insert into the Cortext table initial values first             //This inserts into a database table the user to check.             //This table is used to get the initial recipient list.              //Any users in this table are not in the list.             InsertCortextInformation(tiRecipientID, tiDeviceTypeID, tstrPropertyValue);              switch (tiDeviceTypeID)             {                 case 1:                     tstrProperty = "mobile";                     break;                 case 2:                     tstrProperty = "email";                     break;                 case 3:                     tstrProperty = "pager";                     break;                 default:                     break;             }              //Results from cortext call add to data table             //User not in the directory results in this method call to return a 404 error.             //Exception breaks out of the loop             objCortextResult = GetCortextUserInformation(tstrProperty, tstrPropertyValue);             //Add results to datatable             DataRow newRow = tdtCortextResultData.NewRow();             newRow["RecipientID"] = Convert.ToInt32(row["RecipientID"].ToString());             newRow["DeviceTypeID"] = Convert.ToInt32(row["DeviceTypeID"].ToString());             newRow["DeviceAddress"] = row["Address"].ToString();             newRow["CUID"] = objCortextResult.CUID;             newRow["InviteStatus"] = objCortextResult.inviteStatus;             newRow["IsEnabled"] = objCortextResult.isEnabled;             newRow["FirstName"] = objCortextResult.userFirstName;             newRow["LastName"] = objCortextResult.userLastName;             newRow["MiddleName"] = objCortextResult.userMiddleName;             newRow["HonorificPrefix"] = objCortextResult.userHonorificPrefix;             newRow["HonorificSuffix"] = objCortextResult.userHonorificSuffix;             newRow["Email"] = objCortextResult.email;             newRow["Mobile"] = objCortextResult.mobile;             newRow["Pager"] = objCortextResult.pager;              tdtCortextResultData.Rows.Add(newRow);          }          //Insert data table results into Paging Tool table, PagingToolCortextInfo         int tiRecID, tiDeviceID;         bool tbIsEnabled;         foreach (DataRow row in tdtCortextResultData.Rows)         {             tiRecID = Convert.ToInt32(row["RecipientID"].ToString());             tiDeviceID = Convert.ToInt32(row["DeviceTypeID"].ToString());             tbIsEnabled = Convert.ToBoolean(row["IsEnabled"].ToString());             UpdateCortextInformation(tiRecID, tiDeviceID, row["DeviceAddress"].ToString(),                                         row["CUID"].ToString(), row["InviteStatus"].ToString(), tbIsEnabled,                                         row["FirstName"].ToString(), row["LastName"].ToString(), row["MiddleName"].ToString(),                                         row["HonorificPrefix"].ToString(), row["HonorificSuffix"].ToString(),                                         row["Email"].ToString(), row["Mobile"].ToString(), row["Pager"].ToString());         }      }     //Catches the HttpWebResponse errors like 404     catch (WebException e)     {         using (WebResponse response = e.Response)         {             HttpWebResponse httpResponse = (HttpWebResponse)response;             string errorMessage = string.Format("Error code: {0} ", httpResponse.StatusCode);             //         System.Diagnostics.Debug.WriteLine("Error code: {0}", httpResponse.StatusCode);             using (Stream data = response.GetResponseStream())             {                 using (var reader = new StreamReader(data))                 {                     string text = reader.ReadToEnd();                     errorMessage += text;                     //                     System.Diagnostics.Debug.WriteLine(text);                     logger.ErrorException(errorMessage, e);                 }             }         }         throw;     }     catch (Exception ex)     {         logger.ErrorException(ex.Message, ex);         throw;     }     finally     {         if (SqlConn != null)         {             SqlConn.Close();         }     } }   

Por lo tanto, ¿hay alguna forma de continuar en el bucle para que la respuesta de HTTP devuelve un error 404 y obtenga el siguiente usuario?

Me gustaría reconocer el error 404 y continuar en el bucle para obtener a todos los usuarios.

gracias.

Original en ingles

I need to determine if a list of users are in a 3rd party user directory. I am writing the method in C#.NET 4.0. The user list is over 2700 entries. The API to access this user directory uses REST to return the user information. If the user is not in the directory, response to the HttpWebRequest is a 404 error. I catch the WebException error.

The problem is I can only get the user information for 1 user at a time so I would like to do a for loop to go thru the user list. However, when the 404 error occurs, it breaks out of the loop. Is there any way to catch the 404 error and continue the loop with the next user?

This is my code:

    public void GetRecipientDataFromCortext() {     SqlConnection SqlConn = null;     CortextUser objCortextResult;     try     {         string strStoredProcedure = "PagingToolGetRecipientsAndDevices";         DataTable tdtRecipientData = new DataTable("RecipientData");         //Create a datatable to store final results         DataTable tdtCortextResultData = new DataTable("CortextResults");         tdtCortextResultData.Columns.Add("RecipientID", typeof(int));         tdtCortextResultData.Columns.Add("DeviceTypeID", typeof(int));         tdtCortextResultData.Columns.Add("DeviceAddress", typeof(string));         tdtCortextResultData.Columns.Add("CUID", typeof(string));         tdtCortextResultData.Columns.Add("InviteStatus", typeof(string));         tdtCortextResultData.Columns.Add("IsEnabled", typeof(bool));         tdtCortextResultData.Columns.Add("FirstName", typeof(string));         tdtCortextResultData.Columns.Add("LastName", typeof(string));         tdtCortextResultData.Columns.Add("MiddleName", typeof(string));         tdtCortextResultData.Columns.Add("HonorificPrefix", typeof(string));         tdtCortextResultData.Columns.Add("HonorificSuffix", typeof(string));         tdtCortextResultData.Columns.Add("Email", typeof(string));         tdtCortextResultData.Columns.Add("Mobile", typeof(string));         tdtCortextResultData.Columns.Add("Pager", typeof(string));          string strSqlConnection = ConfigurationManager.ConnectionStrings[CONNECTION_STRING].ConnectionString;         //Get the recipient list from the database         using (SqlConn = new SqlConnection(strSqlConnection))         {             using (SqlCommand SqlCmd = new SqlCommand(strStoredProcedure, SqlConn))             {                 SqlCmd.CommandType = CommandType.StoredProcedure;                 SqlConn.Open();                 using (SqlDataAdapter dataReturned = new SqlDataAdapter(SqlCmd))                 {                     dataReturned.Fill(tdtRecipientData);                                          }             }         }         //For loop to make a call to cortext to get properties of this device          string tstrPropertyValue = string.Empty;         string tstrProperty = string.Empty;         int tiDeviceTypeID;         int tiRecipientID;          //This is the for loop to check each recipient to see if he/she is in the directory         foreach (DataRow row in tdtRecipientData.Rows)         {                            tstrPropertyValue = row["Address"].ToString();             tiDeviceTypeID = Convert.ToInt32(row["DeviceTypeID"].ToString());             tiRecipientID = Convert.ToInt32(row["RecipientID"].ToString());              //Insert into the Cortext table initial values first             //This inserts into a database table the user to check.             //This table is used to get the initial recipient list.              //Any users in this table are not in the list.             InsertCortextInformation(tiRecipientID, tiDeviceTypeID, tstrPropertyValue);              switch (tiDeviceTypeID)             {                 case 1:                     tstrProperty = "mobile";                     break;                 case 2:                     tstrProperty = "email";                     break;                 case 3:                     tstrProperty = "pager";                     break;                 default:                     break;             }              //Results from cortext call add to data table             //User not in the directory results in this method call to return a 404 error.             //Exception breaks out of the loop             objCortextResult = GetCortextUserInformation(tstrProperty, tstrPropertyValue);             //Add results to datatable             DataRow newRow = tdtCortextResultData.NewRow();             newRow["RecipientID"] = Convert.ToInt32(row["RecipientID"].ToString());             newRow["DeviceTypeID"] = Convert.ToInt32(row["DeviceTypeID"].ToString());             newRow["DeviceAddress"] = row["Address"].ToString();             newRow["CUID"] = objCortextResult.CUID;             newRow["InviteStatus"] = objCortextResult.inviteStatus;             newRow["IsEnabled"] = objCortextResult.isEnabled;             newRow["FirstName"] = objCortextResult.userFirstName;             newRow["LastName"] = objCortextResult.userLastName;             newRow["MiddleName"] = objCortextResult.userMiddleName;             newRow["HonorificPrefix"] = objCortextResult.userHonorificPrefix;             newRow["HonorificSuffix"] = objCortextResult.userHonorificSuffix;             newRow["Email"] = objCortextResult.email;             newRow["Mobile"] = objCortextResult.mobile;             newRow["Pager"] = objCortextResult.pager;              tdtCortextResultData.Rows.Add(newRow);          }          //Insert data table results into Paging Tool table, PagingToolCortextInfo         int tiRecID, tiDeviceID;         bool tbIsEnabled;         foreach (DataRow row in tdtCortextResultData.Rows)         {             tiRecID = Convert.ToInt32(row["RecipientID"].ToString());             tiDeviceID = Convert.ToInt32(row["DeviceTypeID"].ToString());             tbIsEnabled = Convert.ToBoolean(row["IsEnabled"].ToString());             UpdateCortextInformation(tiRecID, tiDeviceID, row["DeviceAddress"].ToString(),                                         row["CUID"].ToString(), row["InviteStatus"].ToString(), tbIsEnabled,                                         row["FirstName"].ToString(), row["LastName"].ToString(), row["MiddleName"].ToString(),                                         row["HonorificPrefix"].ToString(), row["HonorificSuffix"].ToString(),                                         row["Email"].ToString(), row["Mobile"].ToString(), row["Pager"].ToString());         }      }     //Catches the HttpWebResponse errors like 404     catch (WebException e)     {         using (WebResponse response = e.Response)         {             HttpWebResponse httpResponse = (HttpWebResponse)response;             string errorMessage = string.Format("Error code: {0} ", httpResponse.StatusCode);             //         System.Diagnostics.Debug.WriteLine("Error code: {0}", httpResponse.StatusCode);             using (Stream data = response.GetResponseStream())             {                 using (var reader = new StreamReader(data))                 {                     string text = reader.ReadToEnd();                     errorMessage += text;                     //                     System.Diagnostics.Debug.WriteLine(text);                     logger.ErrorException(errorMessage, e);                 }             }         }         throw;     }     catch (Exception ex)     {         logger.ErrorException(ex.Message, ex);         throw;     }     finally     {         if (SqlConn != null)         {             SqlConn.Close();         }     } } 

So, is there any way to continue in the for loop after the call Http response returns a 404 error and get the next user?

I would like to acknowledge the 404 error and continue in the for loop to get all of the users.

Thanks.

        
     
     

Lista de respuestas

2
 
vote
vote
La mejor respuesta
 

Esto se puede lograr con bastante facilidad con su código :)

envolver la línea:

  grepl6  

en el try stick:

  grepl7  

El continuar por el código de estado 404 ingresará la siguiente iteración de su bucle y logrará el comportamiento deseado.

¡Déjame saber si necesitas algo más!

 

This can be achieved quite easily with your code :)

Wrap the line:

objCortextResult = GetCortextUserInformation(tstrProperty, tstrPropertyValue); 

in the try catch:

var isNotFound = false; try {     objCortextResult = GetCortextUserInformation(tstrProperty, tstrPropertyValue); } catch(WebException ex) {     if(((HttpWebResponse)ex.Response).StatusCode == HttpStatusCode.NotFound)            {         isNotFound = true;     }     else {         throw;     } }  if (isNotFound) continue;  ... 

The continue for the Status Code 404 will enter the next iteration of your loop and achieve the desired behaviour.

Let me know if you need anything else!

 
 
     
     

Relacionados problema

40  Obtenga solicitudes de HTTP y respuestas hechas utilizando HTTPWEBREQUEST / HTTPWEBRESPONSE para mostrar en Fiddler  ( Get http requests and responses made using httpwebrequest httpwebresponse to sho ) 
¿Hay alguna forma en que pueda enganchar a Fiddler hasta las solicitudes de captura y las respuestas hechas usando .NET httpwebrequest y httpwebresponse? ...

0  HttpwebRequest no tira la excepción  ( Httpwebrequest doesnt throw exception ) 
Tengo un problema con la excepción HTTPWEBREQUEST. Utilizo el siguiente código para hacer una solicitud y atrapar la excepción. try { Uri url= new ...

1  Uso de HTTPSTATURQUEO 207 MULTI-ESTADO  ( Using httpstatuscode 207 multi status ) 
Estoy haciendo un poco de WebDAV, y después de mi llamada de propfind, hago algo así como var content = Encoding.UTF8.GetBytes(propfind.ToString()); httpWe...

0  Publique un formulario HTTP y obtenga el HTML de destino utilizando raspado web  ( Post a http form and get the target html using web scraping ) 
Actualmente estoy trabajando en la construcción de un sitio para publicar en el sitio de terceros y extraer detalles de ellos utilizando el siguiente enfoque ...

1  La aplicación cuelga en GetRequestStream () después de la primera solicitud  ( Application hangs on getrequeststream after first request ) 
He buscado y buscado aquí. Algunos sugieren que los arroyos no estaban siendo cercanos, otros sugirieron que es un límite de conexión con ServicePointManager....

0  ¿Qué patrón de Uri necesito para comunicarme con mi PC desde mi dispositivo de mano?  ( What uri pattern do i need to communicate with my pc from my handheld device ) 
Como me recordó aquí , necesito que probablemente utilice "PPP_PEER" para conectarse programáticamente desde mi aplicación Compact Framework a mi aplicación ...

2  Al recuperar la URL a través de HTTPWEBREQUEST, ¿puedo ver la dirección IP del servidor de destino?  ( When retrieving url via httpwebrequest can i see the ip address of the destinat ) 
Supongamos que estoy recuperando una URL de la siguiente manera: string url = "http://www.somesite.com/somepage.html" HttpWebRequest req = (HttpWebRequest)...

0  Solicitud de servicio web con parámetro en C #  ( Web service request with parameter in c sharp ) 
Tengo servicios de descanso web que llevan un parámetro que es StandingID y devuelve el registro del estudiante. Estoy teniendo dificultades para aprobar el p...

20  HTTPWEBRESPONSE + SRURAWREADER MUY LENTO  ( Httpwebresponse streamreader very slow ) 
Estoy tratando de implementar un rastreador web limitado en C # (solo para unos pocos cientos de sitios) utilizando HttpWebResponse.GetResponse () y Streamrea...

5  Detectar un error de proxy HTTP para WebRequest  ( Detect http proxy error for webrequest ) 
¿Cómo detectar que un webrequest falló debido a un error de proxy web y no un error de servidor web de destino? try { var request = (HttpWebRequest)Web...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos