web-dev-qa-db-fra.com

L'application s'est terminée sans lire l'intégralité du corps de la demande, noyau .net 2.1.1

J'ai créé un contrôleur de registre d'utilisateurs pour enregistrer les utilisateurs avec un modèle de conception de référentiel. Mon contrôleur ressemble à ceci.

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

Lorsque j'envoie une demande à l'aide de Postman, cela me donne le code d'état 404 non trouvé et l'API signale que la demande est terminée sans lire le corps en entier.

 enter image description here

Ma demande dans Postman ressemble à ceci .  enter image description here

J'ai utilisé des objets de transfert de données (DTO) pour encapsuler des données, j'ai supprimé UserForRegisterDto et essayé d'utiliser string username et string password, comme suit, mais cela n'a pas fonctionné.

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

UserForRegisterDto ressemble à ceci.

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

J'ai essayé de nombreuses solutions en ligne pour cela, mais jusqu'à présent rien n'a résolu mon problème. S'il vous plaît, aidez-moi à résoudre le problème, merci d'avance. J'utilise cette API sur Ubuntu 18.04

Edit: 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();
        }
    }
5
Nishan Chathuranga

Les informations d'erreur de the application completed without reading the entire request body se produisent souvent lorsque le client envoie une demande qui ne répond pas aux exigences du serveur. En d'autres termes, cela se produit juste avant d'entrer dans l'action, ce qui signifie que vous ne pouvez pas le déboguer via un point d'arrêt dans la méthode du corps de l'action.

Par exemple, supposons une méthode d'action sur le serveur:

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

La DummyDto est une classe fictive contenant des informations:

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

Lorsque les clients envoient une demande avec une charge utile mal formatée 

Par exemple, la demande de publication suivante, qui n'a pas d'en-tête Content-Type: application/json:

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

{ "id":5 }

entraînera une information d'erreur similaire:

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.

et la réponse du serveur sera 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

En ce qui concerne la question que vous avez décrite, je vous suggère de vérifier la liste suivante:

 enter image description here

  1. le facteur envoie-t-il la demande avec un en-tête de Content-Type: application/json? assurez-vous d'avoir coché l'en-tête 
  2. Si l'étape 1 ne fonctionne pas, cliquez sur la code pour afficher ce qu'elle envoie exactement lorsque vous envoyez une demande au serveur.
8
itminus

J'ai eu la même erreur (même avec "Content-Type: application/json") mais l'ajout de "{id}" au verbe d'action a fonctionné pour moi changer de 

    [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 core 2.1)

1
Robert

Pourriez-vous l'essayer en ajoutant une méthode de requête [Route ("jsonbody")]

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

j'ai même erreur, vérifier peut-être que vous mettez (AutoValidateAntiforgeryTokenAttribute) dans Services AddMvc

services.AddMvc(opt => {

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

Il peut y avoir plusieurs raisons parmi lesquelles on peut être: - Mise en cache dans 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
dinesh kandpal