Ошибка 405 метод не допускается для поста в угловой проект
У меня есть угловой проект, где я реализовал функцию входа в систему в login.service.ts.My проблема в том, что независимо от того, что я делаю, я не могу избавиться от метода ошибки 405, не разрешенного для POST.Когда я проверяю Postman для API, он выдает мне ту же ошибку, и он отображает только DELETE и PUT как разрешенные методы.Это класс обслуживания:
import { Injectable } from '@angular/core'; import {Register} from '../Models/register'; import { HttpClient, HttpHeaders, HttpErrorResponse} from '@angular/common/http'; import { BehaviorSubject, Observable, throwError } from 'rxjs'; import { map, catchError } from 'rxjs/operators'; import { Router } from '@angular/router'; @Injectable({ providedIn: 'root' }) export class LoginService { headers = new HttpHeaders().set('Content-Type', 'application/json;charset=utf-8').append('Authorization', 'Bearer'); currentUser = {}; ApiUrl = 'https://localhost:5001'; constructor(private http: HttpClient, public router: Router) { } login(user: Register) { return this.http.post(this.ApiUrl + '/register/login', user) .subscribe((res: any) => { localStorage.setItem('access_token', res.token); // tslint:disable-next-line:no-shadowed-variable this.getUserProfile(res.id).subscribe((res) => { this.currentUser = res; this.router.navigate(['/register/userdata/' + res.msg.id]); }); }); } getToken() { return localStorage.getItem('access_token'); } get isLoggedIn(): boolean { const authToken = localStorage.getItem('access_token'); return (authToken !== null) ? true : false; } doLogout() { const removeToken = localStorage.removeItem('access_token'); if (removeToken == null) { this.router.navigate(['login']); } } // User profile getUserProfile(id): Observable<any> { const api = this.ApiUrl + 'register/userdata/' + id; return this.http.get(api, { headers: this.headers }).pipe( map((res: Response) => { return res || { }; }), catchError(this.handleError) ); } handleError(error: HttpErrorResponse) { let msg = ''; if (error.error instanceof ErrorEvent) { // client-side error msg = error.error.message; } else { // server-side error msg = `Error Code: ${error.status}\nMessage: ${error.message}`; } return throwError(msg); } }
Это и есть login.component.ts:
import { Component, OnInit } from '@angular/core'; import { Router, ActivatedRoute } from '@angular/router'; import { FormBuilder, FormGroup, Validators } from '@angular/forms'; import { LoginService } from '../services/login.service'; import { first } from 'rxjs/operators'; import {ToastrManager} from 'ng6-toastr-notifications'; @Component({ selector: 'app-login', templateUrl: './login.component.html', styleUrls: ['./login.component.css'] }) export class LoginComponent implements OnInit { loginForm: FormGroup; loading = false; submitted = false; returnUrl: string; constructor(private formBuilder: FormBuilder, private route: ActivatedRoute, private router: Router, private loginService: LoginService, public toast: ToastrManager, ) { } ngOnInit() { this.loginForm = this.formBuilder.group({ email: ['', Validators.required], password: ['', Validators.required] }); } get loginFormControl() {return this.loginForm.controls; } onSubmit() { this.submitted = true; // stop here if form is invalid if (this.loginForm.invalid) { return; } this.loading = true; this.loginService.login(this.loginForm.value); this.toast.successToastr('Its working'); this.router.navigate(['register/userdata/id']); } }
Я воссоздал пару версий из интернета с аутентификацией на стороне клиента, но снова и снова выдавал одну и ту же ошибку, независимо от того, какую версию я использовал.
Я понятия не имею,почему это не работает, я борюсь в течение некоторого времени с ошибкой, и я попробовал почти все возможные комбинации, чтобы заставить ее работать.Есть ли у кого-нибудь представление об этой проблеме и как ее можно решить? Любая помощь будет оценена по достоинству!!!
ОБНОВЛЕНИЕ:
Это класс контроллера сервера:
[EnableCors] [Authorize] [ApiController] [Produces("application/json")] [Route("[controller]")] public class LoginController : ControllerBase { private readonly IConfiguration _config; public LoginController(IConfiguration config) { _config = config; } private List<Register> appUsers = new List<Register>(); [AllowAnonymous] [HttpPost] [Route("login")] public IActionResult Login([FromBody] Register model) { IActionResult response = Unauthorized(); Register user = AuthenticateUser(model); if (user != null) { var tokenString = GenerateJWT(user); response = Ok(new { token = tokenString, userDetails = user, }); } return response; } string GenerateJWT(Register user) { var securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_config["Jwt:SecretKey"])); var credentials = new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256); var claims = new[] { new Claim(JwtRegisteredClaimNames.Sub, user.Email), new Claim("Name", user.Name.ToString()), new Claim("role",user.Role), new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()), }; var token = new JwtSecurityToken( issuer: _config["Jwt:Issuer"], audience: _config["Jwt:Audience"], claims: claims, expires: DateTime.Now.AddMinutes(30), signingCredentials: credentials ); return new JwtSecurityTokenHandler().WriteToken(token); } Register AuthenticateUser(Register login) { Register user = appUsers.SingleOrDefault(x => x.Email == login.Email && x.Password == login.Password); return user; } }
Это зарегистрировать.классе по информатике :
public class Register { public string Role { get; set; } public string Name { get; set; } [Key] public int Id { get; set; } public string Email { get; set; } public string Password { get; set; } }
Что я уже пробовал:
Я попытался назначить функцию email и пароль и получить их значения с помощью JSON.stringify(),я попытался изменить заголовок, чтобы разрешить метод POST, но потом я понял, что уже сделал это в своем классе промежуточного программного обеспечения CORS, которому я передаю его в Startup.cs.(серверная сторона).Когда я ставлю точки останова для его отладки,у меня нет никаких проблем с ним, так как он фактически считывает введенную информацию, но в login.service.ts, когда я нажимаю точку останова в
localStorage.setItem('access_token', res.token);в localStorage он дает мне длину 0, а после isLoggedIn boolean устанавливается в false, так как он не будет входить в систему.Я не знаю, насколько это актуально, но я также получаю это при установке точек останова(когда я смотрю на методы):
TypeError: 'caller', 'callee', and 'arguments' properties may not be accessed on strict mode functions or the arguments objects for calls to them.
Я понимал, что это обычно вызвано синтаксисом "use strict", но у меня нет никаких js, о которых мне нужно беспокоиться.