Aquí está la pregunta: ¿Qué impediría que este código ejecute esta solicitud http?
Aquí está la configuración: estoy haciendo un proyecto que tiene varias API, y este es un método que se llama del primero al segundo para obtener información de validación. El método, en teoría, debería realizar la solicitud, enviar el modelo al segundo servicio y regresar con algo que se devuelve al final de este método.
Cuando se ejecutan ambas API localmente con puntos de interrupción para ver si están siendo atacadas, la segunda nunca es atacada, porque en el momento en que se golpea la línea ExecuteAsync(), se bloquea y luego reinicia la primera API. No creo que haya hecho nada malo aquí, pero no hay ningún tipo de seguimiento de pila o excepción que me arroje, incluso si lo puse en un intento/captura. ¿Es este un problema conocido o simplemente estoy haciendo algo mal aquí?
public async Task<SharkTankValidationResponseModel> CheckIfValidRequest(SharkTankValidationModel requestModel) { // Setup rest client RestClient userRestClient = new RestClient(endpoint + "SharkTank/Validate"); RestRequest userRequest = new RestRequest(Method.POST); // New request object for body userRequest.AddJsonBody(requestModel); // HTTP Request IRestResponse response = await userRestClient.ExecuteAsync(userRequest); return JsonConvert.DeserializeObject<SharkTankValidationResponseModel>(response.Content); }En el nivel superior, así es como se llama. El modelo se está haciendo correctamente sin problemas, y puedo recorrer el código hasta la función de ejecución antes de que se bloquee.
SharkTankValidationModel model = await makeSharkTankValidationModel(Method.GET, SharkTankConstants.GET_ALL_CLIENT_CATEGORY, null); SharkTankValidationResponseModel validationModel = await sharkTank.CheckIfValidRequest(model);Gif para referencia de los pasos que se ejecutan a través del depurador y el bloqueo repentino https://imgur.com/bWSR78h
Muy bien, lo descubrí después de intentarlo finalmente de una manera que me permitió ver una excepción en una respuesta. El error fue el siguiente:
ActualMessage: "A possible object cycle was detected. This can either be due to a cycle or if the object depth is larger than the maximum allowed depth of 64. Consider using ReferenceHandler.Preserve on JsonSerializerOptions to support cycles." BytePositionInLine: null ClassName: "System.Text.Json.JsonException" Data: null ExceptionMethod: null HResult: -2146233088 HelpURL: null InnerException: null LineNumber: null Message: "A possible object cycle was detected. This can either be due to a cycle or if the object depth is larger than the maximum allowed depth of 64. Consider using ReferenceHandler.Preserve on JsonSerializerOptions to support cycles." Path: "$.requestorRoles.Subject.Claims.Subject.Claims.Subject.Claims.Subject.Claims.Subject.Claims.Subject.Claims.Subject.Claims.Subject.Claims.Subject.Claims.Subject.Claims.Subject.Claims.Subject.Claims.Subject.Claims.Subject.Claims.Subject.Claims.Subject.Claims.Subject.Claims.Subject.Claims.Subject.Claims.Subject.Claims.Subject.AuthenticationType" RemoteStackIndex: 0 RemoteStackTraceString: null Source: "System.Text.Json" StackTraceString: " at System.Text.Json.ThrowHelper.ThrowJsonExcep WatsonBuckets: nullAhora, el objeto que estaba usando para un modelo estaba usando los tipos de objetos de reclamos predeterminados de Microsoft para pasar los reclamos. Aparentemente, esto hizo que el serializador json se asuste y se repita una y otra vez, y simplemente se bloquee cuando encontró un bucle.
La solución fue simplemente crear un tipo de objeto personalizado para asignar esos reclamos y, literalmente, no hubo problemas al usar ninguno de los 3 tipos de llamadas de métodos HTTP diferentes. Para resumir, no use el tipo de reclamo predeterminado para las cosas. Solo crea problemas.
Según la documentación de RestClient, ExecuteAsync no genera una excepción, sino que completa response.ErrorException y response.ErrorMessage si response.IsSuccessful es false . Si no necesita acceder al código de estado de respuesta y solo se preocupa por el cuerpo, simplemente use PostAsync<T> en su lugar.
public async Task<SharkTankValidationResponseModel> CheckIfValidRequest(SharkTankValidationModel requestModel) { // Setup rest client RestClient userRestClient = new RestClient(endpoint); RestRequest userRequest = new RestRequest("SharkTank/Validate") .AddJsonBody(requestModel); // HTTP Request IRestResponse response = await userRestClient.PostAsync<SharkTankValidationResponseModel>(userRequest); return response; }