Este concepto se usa en las aplicaciones web MVC.
El .NET 4.x Marco proporciona varios atributos que desencadenan acciones, por ejemplo .: ExceptionFilterAttribute
(Manejo de excepciones), AuthorizeAttribute
(autorización de tramitación). Ambos se definen en System.Web.Http.Filters
.
Se podría, por ejemplo, definir su propio atributo de autorización como sigue:
public class myAuthorizationAttribute : AuthorizeAttribute
{
protected override bool IsAuthorized(HttpActionContext actionContext)
{
// do any stuff here
// it will be invoked when the decorated method is called
if (CheckAuthorization(actionContext))
return true; // authorized
else
return false; // not authorized
}
}
Luego, en su controlador clase decorar los métodos que se supone que usar su autorización como sigue:
[myAuthorization]
public HttpResponseMessage Post(string id)
{
// ... your code goes here
response = new HttpResponseMessage(HttpStatusCode.OK); // return OK status
return response;
}
Cuando se invoca el método Post
, llamará al método IsAuthorized
dentro del myAuthorization
Atributo antes se ejecuta el código dentro del método Post
.
Si devuelve false
en el método IsAuthorized
, indica que no se concede la autorización y se cancela la ejecución del método Post
.
Para entender cómo funciona esto, vamos a ver en el ExceptionFilter
, que permite excepciones de filtrado mediante el uso de atributos, tal como se muestra anteriormente para el AuthorizeAttribute
.
Se utiliza la interfaz IExceptionFilter
internamente como un contrato:
namespace System.Web.Http.Filters
{
public interface IExceptionFilter : IFilter
{
// Executes an asynchronous exception filter.
// Returns: An asynchronous exception filter.
Task ExecuteExceptionFilterAsync(
HttpActionExecutedContext actionExecutedContext,
CancellationToken cancellationToken);
}
}
El ExceptionFilterAttribute
misma se define de la siguiente manera:
namespace System.Web.Http.Filters
{
// Represents the attributes for the exception filter.
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method,
Inherited = true, AllowMultiple = true)]
public abstract class ExceptionFilterAttribute : FilterAttribute,
IExceptionFilter, IFilter
{
// Raises the exception event.
// actionExecutedContext: The context for the action.</param>
public virtual void OnException(
HttpActionExecutedContext actionExecutedContext)
{
}
// Asynchronously executes the exception filter.
// Returns: The result of the execution.
Task IExceptionFilter.ExecuteExceptionFilterAsync(
HttpActionExecutedContext actionExecutedContext,
CancellationToken cancellationToken)
{
if (actionExecutedContext == null)
{
throw Error.ArgumentNull("actionExecutedContext");
}
this.OnException(actionExecutedContext);
return TaskHelpers.Completed();
}
}
}
Dentro ExecuteExceptionFilterAsync
, el método se llama OnException
. Puede usarlo de manera análoga como se mostró anteriormente para el AuthorizeAttribute
: Cree su propia clase, heredando desde ExceptionFilterAttribute
, y anule el método OnException
.
Existe también un producto comercial disponible como se mencionó en la respuesta de OwenP, PostSharp, lo que le permite hacer tan fácilmente. Here es un ejemplo de cómo puede hacerlo con PostSharp. Tenga en cuenta que hay una edición Express disponible que puede usar gratis incluso para proyectos comerciales.
La respuesta corta es: sí, acompañado por: No sé cómo. Lo que quiere hacer es manipular IL en el momento de la compilación para inyectar una devolución de llamada en la primera y última línea de su método. El ensamblado MS.VB tiene un atributo que realiza alguna manipulación IL (para hacer que una clase sea un singleton no estático). – cfeduke
@Tamas: Sé que su pregunta fue hecha hace mucho tiempo, pero se me ocurrió una respuesta. Espero que te ayude :-) – Matt