Используя C# HttpClient, как поместить строку HttpContent в ASP. net Базовый веб-API? - PullRequest
0 голосов
/ 26 февраля 2020

На стороне клиента я отправляю запрос с использованием класса HttpClient в основной веб-API ASP. net на стороне сервера.

Я хочу отправить строку ("ОК") в теле запроса и строкового аргумента (numStr = 5) в заголовке, я прочитал много похожих потоков, но все еще не удалось.

Вот метод клиента:

    public async void SendBodyAsync(Action<string> onRespond)
    {
        try
        {
            string URL = "http://localhost:60039/api/calculator/AddMore";

            HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, URL);
            request.Headers.Add("numStr", "5");

            request.Content = new StringContent("OK", Encoding.UTF8, "text/plain");   //causes error

            HttpResponseMessage response = await mHttpClient.SendAsync(request);
            response.EnsureSuccessStatusCode();

            string result = await response.Content.ReadAsStringAsync();
            onRespond(result);
        }
        catch (HttpRequestException ex)
        {
            Debug.LogError(ex);       //Unity3D console Debug
            onRespond(null);
        }
    }

Здесь такое действие сервера:

[Route("api/[controller]/[action]")]
[ApiController]
public class CalculatorController : ControllerBase
{
    public string AddMore([FromHeader]string numStr)
    {
        //string bodyStr;
        //get string from Request.Body and set the value to bodyStr
        return (int.Parse(numStr) + 10).ToString();
    }
}

Если я уберу строку «request.Content = new StringContent (« OK », Encoding.UTF8,« text / plain »);» из метода клиента ответное значение равно "15", что является правильным.

Но с запросом. Содержимое клиента показывает ошибку "Произошла ошибка при отправке запроса ---> Система. Net .WebException: для запроса требуется буферизация данных ". Точка останова сервера не сработала, поэтому запрос не был успешно отправлен.

Я создал еще один очень простой серверный метод, использующий HttpListener, он считывает request.Content как поток clientContext правильно. Я думаю, возможно, проблема в том, что request.Content не равен телу Http, и вряд ли это проблема буферизации, как говорится в сообщении об ошибке.

Мои вопросы: 1. Как правильно отправить строку в теле Http , это не аргумент и может быть длинным (например, полный профиль игрока в строковом формате), поэтому он не подходит для заголовка или запроса или ... 2. Как правильно получить и проанализировать строку в теле запроса на стороне сервера?

Большое спасибо за чтение моего поста.

Ответы [ 2 ]

0 голосов
/ 27 февраля 2020

Я не знаю, почему я не могу редактировать собственную ветку. Просто хочу сказать, что я заново создал проект и вставил тот же код, и это сработало. Может быть, люди, которые видят сообщение об ошибке «Произошла ошибка при отправке запроса ---> Система. Net .WebException: для запроса требуется буферизация данных» могут попробовать то же самое. Надеюсь, это поможет.

0 голосов
/ 26 февраля 2020

Глядя на ваш метод AddMore. Я думаю, что вы также должны получить содержимое тела, используя строковый параметр [FromBody] , я не вижу его указанного.

Обратите внимание, что если вы не укажете принять / тип контента, то по умолчанию это приложение / json in. NET core

PS Также рассмотрите возможность сделать ваш метод AddMore асинхронным c метод

...