Restsharp: NullReferenceException für Körperparameter, die keinen Namen haben

Erstellt am 5. Apr. 2019  ·  20Kommentare  ·  Quelle: restsharp/RestSharp

Erwartetes Verhalten

Ich müsste keinen Namen hinzufügen, sonst wäre die Fehlermeldung deutlicher, dass ein Parametername fehlt.

Tatsächliches Verhalten

Eine NullReferenceException wird ausgelöst.

Schritte zum Reproduzieren des Problems

  1. Fügen Sie einen Anforderungstextparameter ohne Namen hinzu

Dies muss das Problem in RestClient.ConfigureHttp sein (vorausgesetzt, der Name ist dort):

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

Spezifikationen

  • Version: 106.6.9.0
  • Plattform: .NET Framework
  • Teilsystem:

StackTrace


System.NullReferenceException: Der Objektverweis wurde nicht auf eine Instanz eines Objekts festgelegt.
bei RestSharp.RestClient.<>c__DisplayClass172_0.b__8(Parameter p)
at System.Linq.Enumerable.Any TSource
bei RestSharp.RestClient.ConfigureHttp(IRestRequest-Anfrage)
at RestSharp.RestClient.ExecuteAsync(IRestRequest-Anfrage, Aktion 2 callback, String httpMethod, Func 4 getWebRequest)
at RestSharp.RestClient.ExecuteAsync (IRestRequest-Anforderung, Action`2-Rückruf, Methode httpMethod)

Alle 20 Kommentare

@vbenedichuk Gibt es einen Grund, warum Sie keine PR einreichen möchten?

In der nächsten Ausgabe geschlossen. Brechende Veränderung!

Ich habe versucht, ein Problem zu debuggen / zu beheben, habe jedoch festgestellt, dass Ihre Änderung einen Fehler verursacht hat. Siehe Zeile https://github.com/restsharp/RestSharp/blob/a8a9f3473be30317fc449c1c47e3f3cd74e8bab4/RestSharp/RestRequest.cs#L335

Sie werden sehen, dass die Zeile ein Objekt neu erstellt, aber keinen für die Validierung erforderlichen Namen bereitstellt:

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

Eingereichte Pull-Anfrage:
https://github.com/restsharp/RestSharp/pull/1337

Anscheinend fehlen uns einige Tests. In der Tat benötigen Körperparameter keinen Namen. Ich denke, eine bessere Lösung würde nur prüfen, ob der Name für Parameter, die nicht vom Typ body sind, nicht leer ist.

Ich habe die Pull-Anfrage aktualisiert, um Ihre Idee widerzuspiegeln.

Ich habe dieses Problem nur entdeckt, weil ich versucht habe, RestSharp besser zu verstehen. Es scheint derzeit kein Problem im Nuget-Paket zu sein.

Ja, die neue Version ist noch nicht veröffentlicht. Ich habe einige weitere Änderungen vorgenommen, um mich auf eine bessere asynchrone Behandlung vorzubereiten und auch einige der Probleme mit der Ausnahmebehandlung zu beheben

wann wird es behoben?

Ich kann sehen, dass es Version 106.7.0 gibt, aber mein Visual Studio zeigt nur 106.6.10 an, warum?

Fest in 106,9

Dies bleibt ein Problem im neuesten Build Alexey

@ronaldfeb Ich habe den PR zusammengeführt, der behauptete, dieses Problem zu beheben.

@alexeyzimarev Ich habe nur eine einfache Post-Funktion, die ein JSON-Objekt als Körper aufnimmt. Der name-Parameter für den Body ist 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 });
        }

Der Json-Körper:

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

Könnten Sie die Ausnahmedetails einschließlich des Stacktrace einfügen?

@alexeyzimarev (
Meine RestSharp-Version (106.10.1)

MemberSignUp-Anmeldung = neues MemberSignUp()
{
E-Mail = "TEST",
Spitzname = "TEST",
};
RestRequest req = new RestRequest("/my/resource", Method.POST);

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

aber -> req.Parameters[1].Name = ist leer.

So legen Sie den Parameternamen fest, wenn ich req.AddJsonBody () req.

image

Ich habe einen ähnlichen Fehler
Code

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

Fehler

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)

Ich habe verschiedene Versionen ausprobiert: 106.10.1, 106.10.0б, 106.9.0
Mit einer scheinbaren URL funktioniert es gut

"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 ist ein anderes Problem, bitte öffne ein separates

Ok, das Problem mit dem Anforderungskörperparameter, der einen Namen erfordert, ist _fixed_. Wenn andere Probleme mit dem Parameternamen Null auftreten, öffnen Sie bitte ein separates Problem.

Wie haben Sie eine Breaking Change hinzugefügt (den parameterlosen Konstruktor der Parameter-Klasse entfernt), ohne die Hauptversion zu ändern?
Ich habe versucht, von 106.2.1 auf die neueste Version zu aktualisieren, unter der Annahme, dass es den gleichen Major (106) hat, ohne Änderungen zu unterbrechen, aber NICHT!

@bsalmeida so. Idealerweise sollte die Parameterklasse intern sein. Wir können keine Parameter akzeptieren, die nicht richtig konfiguriert sind, da dies mehr Probleme verursacht, die die Leute hier posten.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

ghd258 picture ghd258  ·  6Kommentare

wojciechrak picture wojciechrak  ·  3Kommentare

ChenJasonGit picture ChenJasonGit  ·  5Kommentare

weswitt picture weswitt  ·  3Kommentare

captnrob picture captnrob  ·  3Kommentare