Приложение завершилось без чтения всего тела запроса,.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 сообщает о том, что запрос выполнен, не читая всего тела.
Моя просьба в Почтальоне выглядит следующим образом.
Я использовал объекты передачи данных (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
Что касается вопроса, который вы описали, я предлагаю вам проверить следующий список:
- почтальон отправляет запрос с заголовком
Content-Type: application/json
? убедитесь, что вы проверили заголовок - Если шаг 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
не разрешает незашифрованный трафик.
Надеется, что это помогает кому-то