web-dev-qa-db-ja.com

アプリケーションは、リクエストボディ、.netコア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は本文全体を読み取らずに完了したリクエストを報告します。

enter image description here

Postmanでの私のリクエストは次のようになります。 enter image description here

データ転送オブジェクト(DTO)を使用してデータをカプセル化しました。次のようにUserForRegisterDtoを削除し、string usernamestring 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; }
    }

私はこれのために多くのオンラインソリューションを試しましたが、これまでのところ何も私の問題を解決しませんでした。問題のトラブルシューティングを手伝ってください、よろしくお願いします。 Ubuntu 18.04でこのAPIを実行しています

編集: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();
        }
    }
18

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. postmanはContent-Type: application/jsonのヘッダーでリクエストを送信しますか?ヘッダーを確認したことを確認してください
  2. Step1が機能しない場合は、codeをクリックして、サーバーにリクエストを送信したときに送信される内容を表示します。
19
itminus

Startup.Configureを使用していたため、localhostでデバッグするときに新しいASP.NET Core 2.1サービスで発生しました。

app.UseHttpsRedirection();

ローカルでデバッグするときにこの設定を無効にしました。

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

考えられる理由はいくつかあります。– 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]
3
dinesh kandpal

「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)

1
Robert

リモートDotnet 2.2-マシンでUbuntu 18.04NGinxを実行している同じ問題があった場合、

.。要求本文全体を読み取らずにアプリケーションが完了した

すべてのAPI呼び出しで。 Dotnetは暗号化されていないトラフィックを許可しないため、SSL証明書をLet's encryptからCERTBotを介してホストにインストールすることで解決しました。

これが誰かを助けることを願っています

1
Haroun Hajem

要求メソッド[Route( "jsonbody")]を追加して試してみてください

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

私は同じエラーがあります、多分あなたがAddMvcサービスに(AutoValidateAntiforgeryTokenAttribute)を入れたことを確認してください

services.AddMvc(opt => {

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

そのように解決しました。から

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

追加の/[Route("api/authentication/")]に。スラッシュat[HttpPost("token")]を削除しました。

0
kuzdu