Простой Flurl GET генерирует ProtocolViolationException: Невозможно отправить тело содержимого с этим типом глагола - PullRequest
0 голосов
/ 12 октября 2019

У меня есть простой HTTP-клиент, который использует Flurl.Http для выдачи запросов к API. У меня есть некоторая конфигурация, которую я настраиваю в конструкторе клиента.

HttpConfiguration.ConfigureDomain(postBaseUrl);
HttpConfiguration.ConfigureDomain(getBaseUrl);

Метод ConfigureDomain содержит:

        FlurlHttp.ConfigureClient(url, cli =>
            cli.Settings.HttpClientFactory = new UseDefaultCredentialsClientFactory());

        FlurlHttp.ConfigureClient(url, cli =>
            cli.WithHeader("Content-Type", "application/json")
               .WithHeader("Accept", "application/json"));

        FlurlHttp.Configure(settings => {
            var jsonSettings = new JsonSerializerSettings
            {
                NullValueHandling = NullValueHandling.Ignore,
                DefaultValueHandling = DefaultValueHandling.Ignore
            };
            settings.JsonSerializer = new NewtonsoftJsonSerializer(jsonSettings);
        });

        FlurlHttp.ConfigureClient(url, cli =>
            cli.Configure(settings =>
            {
                settings.BeforeCall = call => Log.Info($"Received response {call.Response.StatusCode} with payload {call.Response.Content.ReadAsStringAsync().Result}");
                settings.AfterCall = call => Log.Info($"Received response {call.Response.StatusCode} with payload {call.Response.Content.ReadAsStringAsync().Result}");
                settings.OnError = call => Log.Error($"Call failed with exception: {call.Exception} \n\r");
            }));

Наконец, я создаю строку URL ивыдача запроса GET следующим образом:

getBaseUrl.AppendPathSegments("Segment1", "Segment2").GetJsonAsync<Dto>().Result;

, что в конечном итоге приводит к возникновению следующего исключения:

    Call failed with exception: System.Net.ProtocolViolationException: Cannot send a content-body with this verb-type.
   at System.Net.HttpWebRequest.CheckProtocol(Boolean onRequestStream)
   at System.Net.HttpWebRequest.BeginGetRequestStream(AsyncCallback callback, Object state)
   at System.Net.Http.HttpClientHandler.StartGettingRequestStream(RequestState state)
   at System.Net.Http.HttpClientHandler.PrepareAndStartContentUpload(RequestState state)
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Flurl.Http.FlurlRequest.<SendAsync>d__19.MoveNext() 

POST-запросы работают, как и ожидалось, с той же настройкой и использованием PostJsonAsyn (body).

...