Приложение завершено без чтения всего тела запроса, ядро ​​.net 2.1.1 - PullRequest
0 голосов
/ 01 сентября 2018

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

[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);
        }
    }

Когда я отправляю запрос с помощью Почтальона, он выдает мне код состояния 404 «Не найден», а API сообщает о завершении запроса без чтения всего тела.

enter image description here

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

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

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();
        }
    }

Ответы [ 9 ]

0 голосов
/ 04 мая 2019

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

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

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

0 голосов
/ 11 июня 2019

Была та же проблема при запуске Dotnet 2.2 и NGinx на удаленном Ubuntu 18.04 -машина, получил:

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

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

Надеется, что это кому-нибудь поможет

0 голосов
/ 14 марта 2019

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

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

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

SELECT * FROM dbo.person WHERE login= 'value' AND pass = 'value'
0 голосов
/ 20 марта 2019

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

app.UseHttpsRedirection();

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

if (env.IsDevelopment())
{
     app.UseDeveloperExceptionPage();
}
else
{
     app.UseHttpsRedirection();
}
0 голосов
/ 31 января 2019

Может быть несколько причин, из которых: - Кеширование в 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]
0 голосов
/ 25 января 2019

У меня была та же ошибка (даже с «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)

0 голосов
/ 06 января 2019

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

services.AddMvc(opt => {

            //Prevent CSF Attake For POST,PUT,DELETE Verb
            //opt.Filters.Add(new AutoValidateAntiforgeryTokenAttribute());
        })
0 голосов
/ 03 сентября 2018

Информация об ошибке 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, чтобы показать, что именно он отправляет именно при отправке запроса на сервер.
0 голосов
/ 01 сентября 2018

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

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