Restsharp: NullReferenceException para parámetros corporales que no tienen nombre

Creado en 5 abr. 2019  ·  20Comentarios  ·  Fuente: restsharp/RestSharp

Comportamiento esperado

No tendría que agregar un nombre, o el mensaje de error sería más claro que faltaba un nombre de parámetro.

Comportamiento real

Se lanza una NullReferenceException.

Pasos para reproducir el problema

  1. Agregar un parámetro de cuerpo de solicitud sin un nombre

Este debe ser el problema en RestClient.ConfigureHttp (se supone que el nombre está ahí):

var parameterExists =
                    request.Parameters.Any(p =>
                        p.Name.Equals(defaultParameter.Name, StringComparison.InvariantCultureIgnoreCase)
                        && p.Type == defaultParameter.Type);

Especificaciones

  • Versión: 106.6.9.0
  • Plataforma: .NET Framework
  • Subsistema:

StackTrace


System.NullReferenceException: referencia de objeto no establecida en una instancia de un objeto.
en RestSharp.RestClient. <> c__DisplayClass172_0.b__8 (parámetro p)
en System.Linq.Enumerable.Any TSource
en RestSharp.RestClient.ConfigureHttp (solicitud IRestRequest)
en RestSharp.RestClient.ExecuteAsync (solicitud de IRestRequest, acción 2 callback, String httpMethod, Func 4 getWebRequest)
en RestSharp.RestClient.ExecuteAsync (solicitud IRestRequest, devolución de llamada Action`2, método httpMethod)

Todos 20 comentarios

@vbenedichuk ¿ alguna razón por la que no desea enviar un PR?

Cerrado en la próxima versión. ¡Rompiendo el cambio!

Estaba intentando depurar / solucionar un problema, pero descubrí que su cambio introdujo un error. Ver línea https://github.com/restsharp/RestSharp/blob/a8a9f3473be30317fc449c1c47e3f3cd74e8bab4/RestSharp/RestRequest.cs#L335

Verá que la línea está renovando un objeto pero no proporciona un nombre requerido por la validación:

https://github.com/restsharp/RestSharp/blob/a8a9f3473be30317fc449c1c47e3f3cd74e8bab4/RestSharp/Parameter.cs#L28 -L35

https://github.com/restsharp/RestSharp/blob/a8a9f3473be30317fc449c1c47e3f3cd74e8bab4/RestSharp/Validation/Ensure.cs#L13 -L17

Solicitud de extracción enviada:
https://github.com/restsharp/RestSharp/pull/1337

Parece que nos faltan algunas pruebas. De hecho, los parámetros corporales no necesitan un nombre. Creo que una mejor solución solo verificaría si el nombre no está vacío para los parámetros que no son del tipo cuerpo.

Actualicé la solicitud de extracción para reflejar tu idea.

Solo detecté este problema porque estaba tratando de comprender mejor RestSharp. No parece ser un problema en el paquete nuget en este momento.

Sí, la nueva versión aún no está publicada. Hice algunos cambios más en preparación para pasar a un mejor manejo asincrónico y también para abordar algunos de los problemas con el manejo de excepciones

cuando se arreglará?

Puedo ver que existe la versión 106.7.0 pero mi estudio visual muestra solo 106.6.10 ¿por qué?

Fijo en 106,9

Esto sigue siendo un problema en la última versión de Alexey.

@ronaldfeb Fusioné el PR que decía solucionar este problema, ¿podría publicar su código?

@alexeyzimarev Solo tengo una función de publicación simple que toma un objeto JSON como cuerpo. El parámetro de nombre del cuerpo es nulo.

        public async Task<Result> postAsync(object objectToUpdate, string apiEndPoint)
        {
            Result result = new Result();

            try
            {
                var client = new RestClient(apiEndPoint);

                var request = new RestRequest(apiEndPoint, Method.POST);
                request.OnBeforeDeserialization = resp => { resp.ContentType = "application/json"; };
                request.RequestFormat = DataFormat.Json;
                request.AddJsonBody(objectToUpdate);
                var response = await client.ExecuteTaskAsync(request);
                //var response = client.ExecuteDynamic(request);


                if (response.StatusCode != HttpStatusCode.Created)
                {

                    Console.WriteLine("Access Token cannot obtain, process terminate");
                    result.Success = false;
                    result.Message = response.ErrorMessage;
                    return result;

                }

                result.Success = true;
                result.Message = "OK";
                return result;

            }
            catch
            {
                throw;
            }

            // await Audit(_settings, new AuditEntry() { Action = EnumTypes.Actions.Add.ToString(), Area = "Testcase", AuditId = obj.key, DatetimeStamp = DateTime.Now, ClientId = userId, NewValue = obj, OldValue = null });
        }

El cuerpo json:

{
  "smartloadId": "string",
  "clientReference": "string",
  "smsRecipientMsisdn": "string",
  "deviceId": "string",
  "productId": 0,
  "amount": 0,
  "pinless": true,
  "sendSms": true,
  "orderRefID": 0
}

¿Podría pegar los detalles de la excepción, incluido el seguimiento de la pila?

@alexeyzimarev (Corregido en 106.9)
Mi versión RestSharp (106.10.1)

MemberSignUp signup = new MemberSignUp ()
{
Correo electrónico = "PRUEBA",
NickName = "PRUEBA",
};
RestRequest req = new RestRequest ("/ mi / recurso", Method.POST);

        req.AlwaysMultipartFormData = true;
        req.AddHeader("content-Type", "multipart/form-data");
        req.AddJsonBody(signup);

pero -> req.Parameters [1] .Name = está vacío.

cómo configurar el nombre del parámetro cuando lo requiera AddJsonBody ()

image

Tengo un error similar
Código

string url = "http://????????????????????????????/reports/new/Report2_11_1?page=reports/new/Report2_11_1&rep_nd=04.03.2020&rep_nd_h=18&rep_nd_min=00&rep_kd=05.03.2020&rep_kd_h=18&rep_kd_min=00&&rep_nd_fact_time=&rep_nd_h_fact_time=00&rep_nd_min_fact_time=00&rep_kd_fact_time=&rep_kd_h_fact_time=00&rep_kd_min_fact_time=00&train_registration=1&kind_rep_type=1,2&four_report_save=4,5&usw=1007&ush=1108";
CookieContainer container = new CookieContainer();
RestClient client = new RestClient();
client.CookieContainer = container;

RestRequest request = new RestRequest(url, Method.GET);

Error

Unhandled exception. System.ArgumentNullException: Value cannot be null. (Parameter 'name')
   at RestSharp.RestRequest..ctor(String resource, Method method, DataFormat dataFormat)
   at RestSharp.RestRequest..ctor(String resource, Method method)

Probé en diferentes versiones: 106.10.1, 106.10.0б, 106.9.0
Con una URL que parece funcionar bien

"http://????????????????????????????/reports/new/Report2_1_1?page=reports/new/Report2_1_1&rep_nd=01.01.2019&rep_nd_h=0
0&rep_nd_min=00&rep_kd=05.03.2019&rep_kd_h=23&rep_kd_min=59&rep_status=0,1,2,4,5,6,7,10&state_among_road=close&rep_stat
us_among_road=0,1,2,4,6,7,10&rep_flg_add_inv=0&rep_flg_add_inv_among=0&rep_conseq=null&rep_character=null&kind_rep_type
=3&rep_service=null&rep_subdivision=null&rep_nod0=null&rep_place0=null&rep_place0_id=null&rep_stan0_1_id=null&rep_stan0
_2_id=null&rep_place0_value=null&rep_object=null&nod_place=null&rep_asu=0,1,2,5,7,11,12,14,15,20,21&rep_asu_dop=1:1&flg
_alien_service=2&usw=1578&ush=705"

@veliev es un problema diferente, abra uno por separado

Ok, el problema del parámetro del cuerpo de la solicitud que requiere tener un nombre es _fixed_. Si hay algún otro problema con el nombre del parámetro nulo, abra un problema por separado.

¿Cómo agregó un cambio importante (elimine el constructor sin parámetros de la clase Parameter) sin cambiar la versión principal?
He intentado actualizar de 106.2.1 a la última versión, asumiendo que si tiene el mismo mayor (106) sin cambios rotos pero NO!

@bsalmeida así. Idealmente, la clase de parámetro debería ser interna. No podemos aceptar parámetros que no estén configurados correctamente ya que crea más problemas que la gente publica aquí.

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

instriker picture instriker  ·  7Comentarios

vDeggial picture vDeggial  ·  6Comentarios

tomgallard picture tomgallard  ·  6Comentarios

ChenJasonGit picture ChenJasonGit  ·  5Comentarios

stricq picture stricq  ·  6Comentarios