webentwicklung-frage-antwort-db.com.de

Die Anwendung wurde ohne Lesen des gesamten Anfragetextes abgeschlossen. .Net core 2.1.1

Ich habe einen Benutzerregister-Controller erstellt, um Benutzer mit dem Repository-Entwurfsmuster zu registrieren. Mein Controller sieht so aus.

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

Wenn ich eine Anforderung mit Postman sende, wird der Statuscode 404 nicht gefunden angezeigt, und die API meldet, dass die Anforderung abgeschlossen ist, ohne den gesamten Körper zu lesen.

 enter image description here

Meine Anfrage in Postman sieht so aus .  enter image description here

Ich habe Data Transfer Objects (DTO) verwendet, um Daten einzukapseln, entfernte UserForRegisterDto und versuchte, string username und string password wie folgt zu verwenden.

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

UserForRegisterDto sieht so aus.

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

Ich habe viele Online-Lösungen dafür ausprobiert, aber bisher konnte mein Problem nicht gelöst werden. Bitte helfen Sie mir, das Problem zu beheben. Vielen Dank im Voraus. Ich verwende diese API auf 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

Die Fehlerinformation von the application completed without reading the entire request body tritt häufig auf, wenn der Client eine Anforderung sendet, die die Anforderungen des Servers nicht erfüllt. Das heißt, es passiert kurz vor dem Eingeben der Aktion, was dazu führt, dass Sie sie nicht über einen Haltepunkt innerhalb der Methode der Aktion debuggen können.

Nehmen wir zum Beispiel eine Aktionsmethode auf dem Server:

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

DummyDto ist eine Dummy-Klasse, in der Informationen gespeichert werden können:

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

Wenn Clients eine Anfrage senden, deren Payload nicht ordnungsgemäß formatiert ist 

Zum Beispiel die folgende Post-Anfrage, die keinen Content-Type: application/json-Header hat:

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

{ "id":5 }

führt zu einer ähnlichen Fehlerinformation:

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.

und die Antwort vom Server lautet 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

Für die Frage, die Sie beschrieben haben, sollten Sie die folgende Liste überprüfen:

 enter image description here

  1. schickt der Postbote die Anfrage mit dem Header Content-Type: application/json? Stellen Sie sicher, dass Sie die Kopfzeile überprüft haben 
  2. Wenn Schritt 1 nicht funktioniert, klicken Sie auf code, um anzuzeigen, was genau gesendet wird, wenn Sie eine Anfrage an den Server senden.
8
itminus

Es ist mir in einem neuen ASP.NET Core 2.1-Dienst beim Debuggen in localhost passiert, weil ich in Startup.Configure Folgendes hatte:

app.UseHttpsRedirection();

Ich habe diese Einstellung beim lokalen Debuggen deaktiviert:

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

Ich hatte den gleichen Fehler (sogar mit "Content-Type: application/json"), aber das Hinzufügen von "{id}" in das für mich verwendete Action-Verb ändern von 

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

zu

    [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

Hatte das gleiche Problem mit einem Dotnet 2.2 und NGinx auf remote Ubuntu 18.04- Maschine, bekam ein:

... Der Antrag wurde vollständig ausgefüllt, ohne den gesamten Anfragetext zu lesen

bei jedem API-Aufruf. Was es für mich gelöst hat, war, die SSL-Zertifikate über CERTBot von Let's encrypt auf dem Host zu installieren, da Dotnet keinen unverschlüsselten Datenverkehr zulässt.

Hoffentlich hilft das jemandem

1
Haroun Hajem

Könnten Sie es versuchen, indem Sie eine Anforderungsmethode hinzufügen [Route ("jsonbody")]

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

ich habe den gleichen Fehler. Überprüfen Sie, ob Sie (AutoValidateAntiforgeryTokenAttribute) in AddMvc Services gestellt haben

services.AddMvc(opt => {

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

Es kann mehrere Gründe geben, aus denen einer sein kann: - Caching in 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

Ich habe es so gelöst. Von

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

zu [Route("api/authentication/")] mit einem zusätzlichen /. Der Schrägstrich [HttpPost("token")] habe ich entfernt.

0
kuzdu