ユーザー登録コントローラーを作成して、ユーザーをリポジトリー設計パターンに登録しました。私のコントローラーはこのように見えます。
[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
を使用しようとしましたが、機能しませんでした。
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();
}
}
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
のヘッダーでリクエストを送信しますか?ヘッダーを確認したことを確認してくださいcode
をクリックして、サーバーにリクエストを送信したときに送信される内容を表示します。Startup.Configureを使用していたため、localhostでデバッグするときに新しいASP.NET Core 2.1サービスで発生しました。
app.UseHttpsRedirection();
ローカルでデバッグするときにこの設定を無効にしました。
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseHttpsRedirection();
}
考えられる理由はいくつかあります。– 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]
「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)
リモートDotnet 2.2
-マシンでUbuntu 18.04
とNGinx
を実行している同じ問題があった場合、
.。要求本文全体を読み取らずにアプリケーションが完了した
すべてのAPI呼び出しで。 Dotnet
は暗号化されていないトラフィックを許可しないため、SSL証明書をLet's encryptからCERTBotを介してホストにインストールすることで解決しました。
これが誰かを助けることを願っています
要求メソッド[Route( "jsonbody")]を追加して試してみてください
[AllowAnonymous]
[HttpPost("register")]
[Route("jsonbody")]
public async Task<IActionResult> Register([FromBody] UserForRegisterDto userForRegisterDto){}
私は同じエラーがあります、多分あなたがAddMvcサービスに(AutoValidateAntiforgeryTokenAttribute)を入れたことを確認してください
services.AddMvc(opt => {
//Prevent CSF Attake For POST,PUT,DELETE Verb
//opt.Filters.Add(new AutoValidateAntiforgeryTokenAttribute());
})
そのように解決しました。から
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")]
を削除しました。