Проблема маршрутизации атрибутов .Net Core 3.0 WebAPI - PullRequest
0 голосов
/ 06 ноября 2019

Идентификатор клиента: 1147947322680754 PAT: 2a22564a5ce15dd46ee66468097ad0b9

Попытка настроить маршрутизацию атрибутов на моем новом API не может быть выполнена после нескольких часов чтения и копания в источниках. Вы мое последнее средство. Что я делаю не так?

Я настроил app.UseMvc ();при запуске и использовании следующего кода ...

Вот как выглядит BaseController;

[ApiController]
public abstract class GKControllerBase : ControllerBase
{
    private readonly IHttpContextAccessor _accessor;

    public GKControllerBase(IHttpContextAccessor accessor)
    {
        this._accessor = accessor;
    }

}

Вот как выглядит UserController.cs;

[ApiController]
[Route("Services/[controller]/[action]")]
public class UserController : GKControllerBase
{
    public UserController(IHttpContextAccessor accessor) : base(accessor)
    {
    }
    [HttpGet] //Services/User/Logout
    [UserTypeFilter(UserType.Anonymous, UserTypeFilterMode.SingularDeny, ErrorMessage = "You are not logged in!")]
    public object Logout()
    {
        if (GKManagers.SessionManager.TryGetCurrentUser(base.HttpContext, out User user))
        {
            GKManagers.SessionManager.Logout(base.HttpContext, user.UniqueId);

            return this.Answer(HttpStatusCode.OK, null, "Logout successful");
        }
        return this.Answer(HttpStatusCode.InternalServerError);
    }

    [HttpGet("{username}/{password}")] //Services/User/Login/username/password
    [UserTypeFilter(UserType.Anonymous, UserTypeFilterMode.SingularAllow, ErrorMessage = "You are already logged in!")]
    public object Login(string username, string password)
    {
        if (GKManagers.SessionManager.TryLogin(base.HttpContext, username, password, out User user))
            return this.Answer(HttpStatusCode.OK, user, "Login successful");
        return this.Answer(HttpStatusCode.InternalServerError);
    }

}

Вот какGroupController.cs выглядит;

[ApiController]
[Route("Services/[controller]/[action]")]
public class GroupController : GKControllerBase
{
    public GroupController(IHttpContextAccessor accessor) : base(accessor)
    {
    }


    [HttpGet("{groupID:int}")] //Services/Group/Join/1
    [UserTypeFilter(UserType.Anonymous, UserTypeFilterMode.SingularDeny, ErrorMessage = "You are not logged in!")]
    [PermissionFilter
        (Data.Enums.ApplicationContext.Membership_Group, Operation.CanJoin, ErrorMessage = "You are not permitted to join the %groupName%. You might be already in it.")]
    public object Join(Int32 groupID)
    {
        if (GKManagers.SessionManager.TryGetCurrentUser(this.HttpContext, out User currentUser))
        {
            GKManagers.Database.Membership.GroupMembership.Add(new GroupMembership()
            {
                Group = groupID,
                User = currentUser.UserId,
                IsActive = true,
                JoinDate = DateTime.Now,
                LastActionDate = DateTime.Now,
                Status = (Int32)Status.Active,
            });

        }
        return this.Answer(HttpStatusCode.InternalServerError);
    }
}

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

Заранее спасибо!

1 Ответ

0 голосов
/ 06 ноября 2019

Измените маршрутизацию контроллера на:

[Route("Services/[controller]")]

И на действиях попробуйте это:

[HttpGet("[action]")] // Services/User/Logout
[HttpGet("[action]/{groupID:int}")] // Services/Group/Join/1
[HttpGet("[action]/{username}/{password}")] // Services/User/Login/username/password

Или как показано ниже:

[Route("[action]")] // Services/User/Logout
[HttpGet]

[Route("[action]/{groupID:int}")] // Services/Group/Join/1
[HttpGet]

[Route("[action]/{username}/{password}")] // Services/User/Login/username/password
[HttpGet]
...