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.
Ma demande dans Postman ressemble à ceci .
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();
}
}
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:
Content-Type: application/json
? assurez-vous d'avoir coché l'en-tête code
pour afficher ce qu'elle envoie exactement lorsque vous envoyez une demande au serveur.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)
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){}
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());
})
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]