Добавление тела json в СООБЩЕНИЕ с помощью WebRequest

#c# #asp.net #webrequest

Вопрос:

Я пытаюсь опубликовать некоторые элементы в теле, но я продолжаю получать «(400) Неверный запрос», который, как я мог понять, обычно является проблемой с конечной точкой, которую вы пытаетесь поразить. Это правильно, так как я проверил это с помощью простых вызовов.

Это моя первая попытка сделать ПОСТ таким образом с телом, поэтому я не уверен, что я упускаю или делаю неправильно.

Это конечная точка, в которую я пытаюсь попасть

 [Route("api/[controller]")]
   [ApiController]
   public class SaleController : ControllerBase
   {
       [HttpPost]
       [Route("[action]")]
       [Route("Sale/Test")]
       public string Test([FromBody] Inventory[] inventories)
       {
           return "Found me";
       }
}
 

Он выводит сообщение об ошибке 400 в HttpResponse

 
   public IEnumerable<Inventory> GetTest(IpPartial ipPartial, Inventory[] inventories)
        {
            WebRequest request = WebRequest.Create("http://localhost:5002/api/Sale/Test");
            request.Method = "POST";
            request.ContentType = "application/json";
            using (var streamWriter = new StreamWriter(request.GetRequestStream()))
            {
                string jsonString = new JavaScriptSerializer().Serialize(inventories);

                streamWriter.Write(jsonString);
                var httpResponse = (HttpWebResponse)request.GetResponse();
                using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
                {
                    var result = streamReader.ReadToEnd();
                    var pass = result.ToString();
                }
                streamWriter.Flush();
                streamWriter.Close();
            }

            return inventories;
        }
 

Это просто упрощенное представление о том, что я пытаюсь передать

 [
    {
        "id": 1,
        "categoryId": 1,
        "taxId": 1,
        "unitId": 1,
        "scheduleId": 0,
        "description": "Konsultasie",
        "code": ""
    },
    {
        "id": 2,
        "categoryId": 7,
        "taxId": 1,
        "unitId": 1,
        "scheduleId": 10,
        "description": "Laxapet 50g",
        "code": "220L"     
    }
]
 

Комментарии:

1. WebRequest и ему подобные устарели и мертвы. Они находятся на кладбище .net. Используйте IHttpClientFactory вместо этого. Вы найдете их более дружелюбными с современными функциями, и поэтому вопросы, связанные с ними, получат гораздо больше ответов

Ответ №1:

Решил эту проблему, просто переключившись на простой асинхронный вызов.

 public async Task<IEnumerable<Inventory>> CreateSale(IpPartial ipPartial, Inventory[] inventories)
        {
            string jsonString = new JavaScriptSerializer().Serialize(inventories);
            var data = new StringContent(jsonString, Encoding.UTF8, "application/json");
            var url = "http://localhost:5002/api/Sale/CreateSales";
            using var client = new HttpClient();
            var response = await client.PostAsync(url, data);
            string result = response.Content.ReadAsStringAsync().Resu<

            return inventories;
            
        }