.NET Core, кажется, превращает мой запрос POST в запросы GET - PullRequest
0 голосов
/ 06 октября 2019

Я отправляю запрос POST в мое приложение .NET CORE с помощью Postman и Insomnia, и мои контрольные точки в методах [HttpPost] удаляются, но тело пусто, и при отладке Visual Studio показывает, что запрос является GETЗапрос.

Мой класс запуска:

namespace MyBuildingRestfulWebWithCore
{
    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }
        public void ConfigureServices(IServiceCollection services)
        {
            //services.AddMvc();
            services.AddControllers();
            services.AddSingleton<IProductService, ProductService>();
            services.AddDbContext<FlixOneStoreContext>(options => options.UseSqlServer("myconnectionstring;"));
            services.Configure<ApiBehaviorOptions>(options =>
            {
                options.SuppressModelStateInvalidFilter = true;
            });
        }
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            app.UseRouting();
            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
            });
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
        }
    }
}

Мой контроллер:

namespace MyBuildingRestfulWebWithCore.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class CustomersController : ControllerBase
    {
        private readonly FlixOneStoreContext _context;

        public CustomersController(FlixOneStoreContext context)
        {
            _context = context;
        }


        [HttpGet] //this one works
        public async Task<ActionResult<IEnumerable<Customer>>> GetCustomers()
        {
            return await _context.Customers.ToListAsync();
        }

        [HttpPost("test")] //this one fails because customers variable is null
        public async Task<ActionResult<Customer>> PostCustomers([FromBody] Customer customers)
        {
            if (_context.Customers.Any(customer => customer.Email == customers.Email))
            {
                return StatusCode((int)HttpStatusCode.Conflict, "Email already in use");
            }
            _context.Customers.Add(customers);
            //...
            return CreatedAtAction("GetCustomers", new { id = customers.Id }, customers);
        }
        [HttpPost("test2")] //this one fails because request.Content is null, 
//but Visual Studio debugger shows me that the request.Method is a GET request
        public async Task<ActionResult<string>> PostCustomers(HttpRequestMessage request)
        {
            string body = await request.Content.ReadAsStringAsync();
            return body;
        }
    }

Я использую .NET Core 3.0.0 и отправляю свои запросы как через Почтальон, так иБессонница для подтверждения ошибки не на стороне клиента - я установил тело в Postman для raw -JSON, а для Insomnia - JSON (и мой JSON проверяет)

Мое тело запроса выглядит следующим образом:

{
"id":1, 
"gender": "M", 
 "email":"test@test.com",
"firstname": "Firstname",
"lastname": "LastName",
"dob":"1970-07-05T00:00:0",
"mainaddressid":"mainaddr",
"fax":"fax",
"password": "pw",
"newsletteropted": false
}

Я прочитал эту статью из официальных Документов о том, как перейти на .NET Core 3, но не нашел ничего полезного.

Есть идеи? Я неправильно настраиваю свой класс запуска или неправильно использую какой-либо атрибут? (Я не слишком знаком с .NET Core ...)

1 Ответ

0 голосов
/ 09 октября 2019

, как подразумевается комментаторами на мой вопрос, мой JSON не соответствовал моему классу модели, я просто не осознавал этого, потому что тот факт, что HttpRequestMessage не поддерживается в ядре aspnet и его метод показывался как "GET" в отладчикеотвлек меня от реальной проблемы, и поскольку SuppressModelStateInvalidFilter подавил ошибку, как отмечено выше.

Удаление

services.Configure<ApiBehaviorOptions>(options =>
{
options.SuppressModelStateInvalidFilter = true;
});

показало мне фактическую ошибку синтаксического анализа JSON и помогло исправить мой ввод.

...