Restsharp: 名前のないボディパラメータのNullReferenceException

作成日 2019年04月05日  ·  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 PRを提出したくない理由は何ですか?

次のリリースで終了しました。 画期的な変化!

問題をデバッグ/修正しようとしましたが、変更によってバグが発生したことがわかりました。 行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私はJSONオブジェクトを本文として

        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 signup = new MemberSignUp()
{{
メール= "TEST"、
NickName = "TEST"、
};
RestRequest req = new RestRequest( "/ my / resource"、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別の問題です。別の問題を開いてください

わかりました。名前が必要なリクエスト本文パラメータの問題は_fixed_です。 パラメータ名がnullであることに他の問題がある場合は、別の問題を開いてください。

メジャーバージョンを変更せずに、どのようにして重大な変更を追加しましたか(Parameterクラスのパラメーターなしのコンストラクターを削除しました)?
変更を壊さずに同じメジャー(106)を持っていると仮定して、106.2.1から最新バージョンに更新しようとしましたが、そうではありません!

@bsalmeidaそのような。 理想的には、パラメータクラスは内部である必要があります。 正しく構成されていないパラメーターは、人々がここに投稿する問題が増えるため、受け入れることができません。

このページは役に立ちましたか?
0 / 5 - 0 評価