Restsharp: NullReferenceException для параметров тела, у которых нет имени

Созданный на 5 апр. 2019  ·  20Комментарии  ·  Источник: restsharp/RestSharp

Ожидаемое поведение

Мне не нужно было бы добавлять имя, иначе сообщение об ошибке было бы более ясным, что имя параметра отсутствует.

Фактическое поведение

Выбрасывается исключение NullReferenceException.

Шаги по воспроизведению проблемы

  1. Добавить параметр тела запроса без имени

Это должно быть проблема в RestClient.ConfigureHttp (предполагается, что имя есть):

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

Характеристики

  • Версия: 106.6.9.0
  • Платформа: .NET Framework
  • Подсистема:

Трассировки стека


System.NullReferenceException: ссылка на объект не установлена ​​на экземпляр объекта.
в RestSharp.RestClient. <> c__DisplayClass172_0.b__8 (Параметр p)
в System.Linq.Enumerable.Any TSource
в RestSharp.RestClient.ConfigureHttp (запрос IRestRequest)
в RestSharp.RestClient.ExecuteAsync (запрос IRestRequest, действие 2 callback, String httpMethod, Func 4 getWebRequest)
в RestSharp.RestClient.ExecuteAsync (запрос IRestRequest, обратный вызов Action`2, метод httpMethod)

Все 20 Комментарий

@vbenedichuk есть ли причина, по которой вы не хотите

Закрыт в следующем выпуске. Критическое изменение!

Я пытался отладить / исправить проблему, но обнаружил, что ваше изменение привело к ошибке. См. Строку https://github.com/restsharp/RestSharp/blob/a8a9f3473be30317fc449c1c47e3f3cd74e8bab4/RestSharp/RestRequest.cs#L335

Вы увидите, что строка обновляет объект, но не предоставляет имя, требуемое для проверки:

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

Отправленный запрос на перенос:
https://github.com/restsharp/RestSharp/pull/1337

Похоже, нам не хватает некоторых тестов. Действительно, параметры тела не нуждаются в имени. Я думаю, что лучшим исправлением будет проверка только того, не является ли имя пустым для параметров, не относящихся к типу body.

Я обновил пулреквест, чтобы отразить вашу идею.

Я поймал эту проблему только потому, что пытался лучше понять RestSharp. В настоящее время это не проблема в пакете nuget.

Да, новая версия еще не опубликована. Я внес еще несколько изменений в подготовку к переходу к лучшей асинхронной обработке, а также для решения некоторых проблем с обработкой исключений.

когда это будет исправлено?

Я вижу, что есть версия 106.7.0, но моя визуальная студия показывает только 106.6.10, почему?

Исправлено в 106.9

Это остается проблемой в последней сборке Alexey

@ronaldfeb Я объединил PR, который утверждал, что

@alexeyzimarev у меня просто есть простая функция post, которая принимает объект JSON в качестве тела. Параметр имени для тела имеет значение NULL.

        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 });
        }

Тело json:

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

Не могли бы вы вставить детали исключения, включая трассировку стека?

@alexeyzimarev (исправлено в 106.9)
Моя версия RestSharp (106.10.1)

Регистрация MemberSignUp = новый MemberSignUp ()
{
Email = "ТЕСТ",
NickName = "ТЕСТ",
};
RestRequest req = новый RestRequest ("/ мой / ресурс", Method.POST);

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

но -> req.Parameters [1] .Name = пусто.

как установить имя параметра, когда я req.AddJsonBody ()

image

У меня похожая ошибка
Код

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);

Ошибка

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)

Пробовал на разных версиях: 106.10.1, 106.10.0б, 106.9.0
С кажущимся URL-адресом работает хорошо

"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 это другой вопрос, откройте отдельный

Хорошо, проблема с параметром тела запроса, требующим наличия имени, _ исправлена_. Если возникнут другие проблемы с нулевым именем параметра, пожалуйста, откройте отдельный вопрос.

Как вы добавили критическое изменение (удалили конструктор без параметров класса Parameter) без изменения основной версии?
Я пробовал обновиться с 106.2.1 до последней версии, предполагая, что если у него такой же основной (106), без критических изменений, но НЕ!

@bsalmeida нравится. В идеале класс параметров должен быть внутренним. Мы не можем принять параметры, которые настроены неправильно, поскольку это создает больше проблем, которые люди публикуют здесь.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги