У меня есть простой 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).