Eliza Maria Ответов: 1

Ошибка 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, о которых мне нужно беспокоиться.

1 Ответов

Рейтинг:
10

Viswanatha Swamy

Доброе утро,
Основываясь на коде 405 метод не разрешен, похоже, что вы должны включить глагол POST в конфигурации ASP.Net веб-API. Не могли бы вы обратиться к приведенной ниже ссылке для получения дополнительной информации. Также, Пожалуйста, повторите, что у вас есть метод [HttpPost], доступный внутри кода веб-API с соответствующими параметрами. Большое спасибо.

Looks like the issue is with the route you are using in .ts file.
return this.http.post(this.ApiUrl + '/register/login', user)

I assume it should be "/login/login" instead of "/register/login". Becuase your API method has only [Route("login")] has route. Many thanks.
return this.http.post(this.ApiUrl + '/login/login', user)


Я протестировал код на своем ноутбуке с помощью Postman

Устранение неполадок веб-приложений API2, работающих в Visual Studio и завершающихся сбоем на рабочем сервере IIS | Microsoft Docs[^]


Eliza Maria

Спасибо Вам за ваш ответ!К сожалению,у меня нет проекта с расширением .aspx, я работаю с проектом angular по умолчанию, который не содержит файла applicationHost.config.У меня также есть метод [HttpPost] на стороне сервера в контроллере и маршрут, установленный следующим образом:Route[("login")].

Viswanatha Swamy

@Элиза Мария,
Добрый вечер. На основе URL-адреса https://localhost:5001 похоже, что вы выполняете веб-Api на локальном ноутбуке. Конфигурация должна быть выполнена на ASP.Net сторона веб-API. Не могли бы вы, пожалуйста, нажать на конечную точку API с помощью postman, чтобы увидеть, какой вывод дается.

Viswanatha Swamy

@Элиза Мария,
Добрый вечер. Не могли бы вы попробовать отправить логические значения с помощью Postman в конечную точку /register/login? Это поможет нам увидеть, какие выходные данные возвращаются из этой конечной точки.

Eliza Maria

Спасибо за вашу помощь.Это дает мне ту же ошибку, что и в браузере, который является 405-м методом, не разрешенным, и когда я пытаюсь отправить значения, он по какой-то причине не дает никаких выходных данных...

Viswanatha Swamy

@Элиза,
Добрый вечер. Таким образом, два эксперимента указывают на веб-API. Это веб-API, разработанных в .Net или .Объем Ядра? Выполняется ли он в Kestrel Server, IIS Express или IIS? Пожалуйста, посоветуйте.

Eliza Maria

Я использую .Net Core с Kestrel

Eliza Maria

Все дело в том, что на стороне сервера все в порядке.Я установил свойства контроллера, включив CORS и маршрут для api, так что никаких проблем быть не должно.Насколько я понял и, пожалуйста, поправьте меня, если я ошибаюсь, эта ошибка имеет отношение к клиентской стороне.

Viswanatha Swamy

@Элиза,
Я на стороне сервера тот самый и запущенный. Я предполагаю, что это должно сработать, когда мы используем почтальона. Пожалуйста, сообщите, проходит ли ваш почтальон?

Viswanatha Swamy

@Элиза,
Добрый вечер. Не могли бы вы просто опубликовать подпись метода? Будет полезно также иметь атрибуты. Большое спасибо.

Eliza Maria

Готово!Пожалуйста дайте мне знать если вам нужна какая либо дополнительная информация и еще раз спасибо за вашу помощь :)

Viswanatha Swamy

Я работаю над этим. Позвольте мне попробовать ваш код на моем ноутбуке и дать вам знать. Дай мне немного времени. Большое спасибо.

Eliza Maria

хорошо, конечно!Большое вам спасибо за вашу помощь!

Viswanatha Swamy

Похоже, проблема заключается в маршруте, который вы используете в файле .ts.
вернуть это.протоколу HTTP.после(этого.ApiUrl + '/register/login', пользователь)

Я предполагаю, что это должно быть "/login/login" вместо "/register/login". Потому что ваш метод API имеет только [Route("login")] имеет маршрут. Большое спасибо.
вернуть это.протоколу HTTP.после(этого.ApiUrl + '/login/login', пользователь)

Eliza Maria

Ух ты, спасибо!Я вижу, что ты прав.Когда я это делаю, я получаю 401 несанкционированный доступ, что означает, что путь на самом деле хороший.Я забыл, что использую контроллер входа в систему, а не контроллер регистрации.Большое вам спасибо за вашу помощь!!!С наилучшими пожеланиями!