Приложение завершилось без чтения всего тела запроса,.net core 2.1.1

Я создал контроллер регистрации пользователей для регистрации пользователей с шаблоном проектирования хранилища. Мой контроллер выглядит так.

[Route("api/[controller]")]
    public class AuthController : Controller
    {
        private readonly IAuthRepository _repo;
        public AuthController(IAuthRepository repo)
        {
            _repo = repo;
        }

        [AllowAnonymous]
        [HttpPost("register")]
        public async Task<IActionResult> Register([FromBody] UserForRegisterDto userForRegisterDto){
            // validate request
            if(!ModelState.IsValid)
            return BadRequest(ModelState);

            userForRegisterDto.Username = userForRegisterDto.Username.ToLower();

            if(await _repo.UserExists(userForRegisterDto.Username)) 
            return BadRequest("Username is already taken");

            var userToCreate = new User{
                Username = userForRegisterDto.Username
            };

            var createUser = await _repo.Register(userToCreate, userForRegisterDto.Password);

            return StatusCode(201);
        }
    }

Когда я отправляю запрос с помощью Postman, он выдает мне код состояния 404 not found, и API сообщает о том, что запрос выполнен, не читая всего тела.

enter image description here

Моя просьба в Почтальоне выглядит следующим образом. enter image description here

Я использовал объекты передачи данных (DTO) для инкапсуляции данных, я удалил UserForRegisterDto и попытался использовать string username и string password, как UserForRegisterDto ниже, но это не сработало.

public async Task<IActionResult> Register([FromBody] string username, string password)

UserForRegisterDto выглядит следующим образом.

 public class UserForRegisterDto
    {
        [Required]
        public string Username { get; set; }

        [Required]
        [StringLength(8, MinimumLength =4, ErrorMessage = "You must specify a password between 4 and 8 characters.")]
        public string Password { get; set; }
    }

Я перепробовал много онлайн-решений для этого, но пока что ничего не решило мою проблему. Пожалуйста, помогите мне решить проблему, заранее спасибо. Я использую этот API в Ubuntu 18.04

Изменить: Startup.cs

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

        public IConfiguration Configuration { get; }

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddDbContext<DataContext>(x => x.UseSqlite(Configuration.GetConnectionString("DefaultConnection")));
            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

            services.AddCors();
            services.AddScoped<IAuthRepository, AuthRepository>();
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseHsts();
            }
            app.UseCors(x => x.AllowAnyHeader().AllowAnyMethod().AllowAnyOrigin().AllowCredentials());
            app.UseMvc();
        }
    }

Ответ 1

Информация об ошибке the application completed without reading the entire request body часто возникает, когда клиент отправляет запрос, который не удовлетворяет серьезным требованиям. Другими словами, это происходит непосредственно перед входом в действие, в результате чего вы не можете отладить его через точку останова в теле метода действия.

Например, скажем, метод действия на сервере:

[Route("api/[controller]")]
[ApiController]
public class DummyController : ControllerBase
{
    [HttpPost]
    public DummyDto PostTest([FromBody] DummyDto dto)
    {
        return dto;
    }
}

DummyDto - это фиктивный класс для хранения информации:

public class DummyDto 
{
    public int Id { get; set; }
}

Когда клиенты отправляют запрос с полезной нагрузкой, плохо отформатированной

Например, следующий пост-запрос, который не имеет заголовка Content-Type: application/json:

POST https://localhost:44306/api/test HTTP/1.1
Accept : application/json

{ "id":5 }

приведет к аналогичной информации об ошибке:

Microsoft.AspNetCore.Hosting.Internal.WebHost:Information: Request starting HTTP/1.1 POST http://localhost:44306/api/test  10
Microsoft.AspNetCore.Hosting.Internal.WebHost:Information: Request finished in 1.9319ms 404 
Microsoft.AspNetCore.Server.Kestrel:Information: Connection id "0HLGH8R93RPUO", Request id "0HLGH8R93RPUO:00000002": the application completed without reading the entire request body.

и ответ от сервера будет 404:

HTTP/1.1 404 Not Found
Server: Kestrel
X-SourceFiles: =?UTF-8?B?RDpccmVwb3J0XDIwMThcOVw5LTFcU08uQXV0aFJlYWRpbmdXaXRob3V0RW50aXRlQm9keVxBcHBcQXBwXGFwaVx0ZXN0?=
X-Powered-By: ASP.NET
Date: Mon, 03 Sep 2018 02:42:53 GMT
Content-Length: 0

Что касается вопроса, который вы описали, я предлагаю вам проверить следующий список:

enter image description here

  1. почтальон отправляет запрос с заголовком Content-Type: application/json? убедитесь, что вы проверили заголовок
  2. Если шаг 1 не работает, щелкните code чтобы показать, что именно он отправляет именно тогда, когда вы отправляете запрос на сервер.

Ответ 2

Это случилось со мной в новой службе ASP.NET Core 2.1 при отладке на локальном хосте, потому что я имел в Startup.Configure:

app.UseHttpsRedirection();

Я деактивировал этот параметр при локальной отладке:

if (env.IsDevelopment())
{
     app.UseDeveloperExceptionPage();
}
else
{
     app.UseHttpsRedirection();
}

Ответ 3

Причин может быть несколько: - Кэширование в Visual Studio -

1.Close all the instances of visual studios, run Developer command prompt with Admin rights.
2.git clean -xfd [Your Repository to remove all dependencies and existing soln file]
3.take the latest build and run . [Make Endpoint AllowAnonymous]

Ответ 4

У меня была та же ошибка (даже с "Content-Type: application/json"), но добавление "{id}" в глагол действия сработало для меня, т.е. изменилось с

    [HttpPatch]
    [ActionName("Index")]
    [Authorize(Policy = "Model")]
    public async Task<JsonResult> Update([FromRoute]int id, int modelId, [FromBody]Device device)

в

    [HttpPatch("{id}")]
    [ActionName("Index")]
    [Authorize(Policy = "Model")]
    public async Task<JsonResult> Update([FromRoute]int id, int modelId, [FromBody]Device device)

(ядро asp.net 2.1)

Ответ 5

Не могли бы вы попробовать, добавив метод запроса [Route ("jsonbody")]

 [AllowAnonymous]
 [HttpPost("register")]
 [Route("jsonbody")]
    public async Task<IActionResult> Register([FromBody] UserForRegisterDto userForRegisterDto){}

Ответ 6

у меня та же ошибка, проверьте, может быть, вы положили (AutoValidateAntiforgeryTokenAttribute) в AddMvc Services

services.AddMvc(opt => {

            //Prevent CSF Attake For POST,PUT,DELETE Verb
            //opt.Filters.Add(new AutoValidateAntiforgeryTokenAttribute());
        })

Ответ 7

В моем случае был неверный запрос:

SELECT * FROM dbo.person WHERE login= 'value' && pass = 'value'

Решено после исправления && неправильно AND хорошо

SELECT * FROM dbo.person WHERE login= 'value' AND pass = 'value'

Ответ 8

Я решил это так. От

namespace AuthenticationService.Controllers
{
    [Route("api/authentication")]
    [ApiController]
    public class AuthenticationController : ControllerBase
    {
        [HttpPost("/token")]
        public IActionResult GenerateToken([FromBody] LoginRest loginRest)
        {

на [Route("api/authentication/")] с дополнительным /. [HttpPost("token")] черту в [HttpPost("token")] я удалил.

Ответ 9

При той же проблеме с запуском Dotnet 2.2 и NGinx на удаленной Ubuntu 18.04 -machine получилось:

... приложение завершено без чтения всего тела запроса

на каждый API-вызов. Для меня это решило установить SSL-сертификаты через CERTBot от Let Dotnet, поскольку Dotnet не разрешает незашифрованный трафик.

Надеется, что это помогает кому-то