sid2586 Ответов: 1

Как выполнить логику контроллера в фильтрах в webapi


I have existing logic to validate against database in place.For eg. I have two controllers, ControllerA & ControllerB, i have AuthorizeAttribute on ControllerA, Now when i get request for ControllerA action method, first my Custom AuthorizeAttribute get request it process some authorization logic and then control goes to ControllerA action method, now i want before my ControllerA action method is hit i want some validation on ControllerB to be performed and again control goes to ControllerA action method. In short i want other controller method(some logic) to be executed before actual requested action method is called.


public class ControllerA : ApiController
{
//some code

[MyCustomAuthorizeAttribute]
public SomeClass MyMethod() {
    return new SomeClass();
}
}

public class ControllerB : ApiController
{
//some additional existing logic here

public bool IsValidUser() {
    //perform addtional check using existing logic
    return true;
}

}


public class MyCustomAuthorizeAttribute : AuthorizeAttribute
{
//Some authorization logic here

//I want to execute ControllerB action method IsValidUser() here 
//If i reieve true the control should go to ControllerA MyMethod 

}


Что я уже пробовал:

Вместо изменения существующего проверенного и развернутого кода мы можем создать новый фильтр и применить его к требуемым методам.

Richard Deeming

В этом нет никакого смысла. Поместите всю логику авторизации в атрибут authorization. Или переместите его в свой собственный класс и вызовите его оттуда, где он вам нужен.

Если вам нужна дополнительная логика в определенных случаях, создайте второй атрибут авторизации и добавьте оба к соответствующим действиям / контроллерам.

1 Ответов

Рейтинг:
0

David_Wimbley

Вместо того, чтобы пытаться вставить квадратный колышек в круглое отверстие, вам нужно рефакторировать свой код до чего-то, что действительно будет работать и иметь смысл. Вызов кода контроллера из атрибута не имеет смысла.

Вытащите метод IsValidUser из контроллера B, переместите его в класс MyCustomAuthenticator и затем вызовите его следующим образом var auth = new MyCustomAuthenticator(); auth.IsValidUser();

Но чтобы ответить на ваш вопрос точно так, как вы его задали, просто создайте экземпляр контроллера внутри вашего атрибута и назовите его так. Это не очень хорошая идея.

public class MyCustomAuthorizeAttribute : AuthorizeAttribute
{
//Some authorization logic here

//I want to execute ControllerB action method IsValidUser() here 
//If i reieve true the control should go to ControllerA MyMethod 
 public void AnExampleMethodCuaseThereWasntOneHere()
 {
    var controllerB = new ControllerB();
    controllerB.IsValidUser();
 }
}


Я не знаю, что означает "//If i reieve true the control should go to ControllerA MyMethod", похоже, вы хотите сделать перенаправление на контроллер A, но для этого вам нужен код, используемый в контроллере B.

Короче говоря, лучший вариант здесь-это рефакторинг вашего кода, это хороший пример ситуаций, когда вы возвращаетесь к нему через 5 месяцев и не знаете, что с ним происходит.