Base solution for your next web application
Open Closed

Custom interceptor issue : Interceptor is not called #4963


User avatar
0
travelsoft created

using this tutorial i came across an issue i can't figure out. : [https://aspnetboilerplate.com/Pages/Documents/Articles/Aspect-Oriented-Programming-using-Interceptors/index.html])

When i call my api, my intercept constructor is hit but never the method void Intercept(IInvocation invocation). When i use unit testing, my interceptor is called perfectly. What am i doing wrong?

I've debugged extensivly and on app startup the registar class is called for every application method.

my code

public static class MeasureDurationInterceptorRegistrar
    {
        public static void Initialize(IKernel kernel)
        {
            kernel.ComponentRegistered += Kernel_ComponentRegistered;
        }

        private static void Kernel_ComponentRegistered(string key, IHandler handler)
        {
            if (typeof(IApplicationService).IsAssignableFrom(handler.ComponentModel.Implementation))
            {
                handler.ComponentModel.Interceptors.Add
                (new InterceptorReference(typeof(MeasureDurationInterceptor)));
            }
        }
    }
public class MeasureDurationInterceptor : IInterceptor
    {
        public ILogger Logger { get; set; }

        public MeasureDurationInterceptor()
        {
            Logger = NullLogger.Instance;
        }

        public void Intercept(IInvocation invocation)
        {
            //Before method execution
            var stopwatch = Stopwatch.StartNew();

            //Executing the actual method
            invocation.Proceed();

            //After method execution
            stopwatch.Stop();
            Logger.InfoFormat(
                "MeasureDurationInterceptor: {0} executed in {1} milliseconds.",
                invocation.MethodInvocationTarget.Name,
                stopwatch.Elapsed.TotalMilliseconds.ToString("0.000")
                );
        }
    }
public class MyGlobyApplicationModule : AbpModule
    {
        public override void PreInitialize()
        {
            //Adding authorization providers
            Configuration.Authorization.Providers.Add<AppAuthorizationProvider>();

            //Adding custom AutoMapper configuration
            Configuration.Modules.AbpAutoMapper().Configurators.Add(CustomDtoMapper.CreateMappings);

            ////register custom interceptor for tenant control
            //TenantAuthorizationInterceptorRegistrar.Initialize(IocManager.IocContainer.Kernel);
            MeasureDurationInterceptorRegistrar.Initialize(IocManager.IocContainer.Kernel);
        }
Markdown is supported
Copy & paste or drag & drop images (max 30 MB per image)

5 Answer(s)
  • User Avatar
    0
    aaron created
    Support Team

    Is your method public virtual? Related issue: aspnetboilerplate/aspnetboilerplate#3237

    Markdown is supported
    Copy & paste or drag & drop images (max 30 MB per image)
  • User Avatar
    0
    travelsoft created

    It's not, but how come abpauthorize works then? I cannot change all my methods to virtual. this seems bad practice.

    the real goal is to create a custom attribute and places on various services. it's for methods that are not authorized but we must have a tenant id.

    Markdown is supported
    Copy & paste or drag & drop images (max 30 MB per image)
  • User Avatar
    0
    aaron created
    Support Team

    how come abpauthorize works then?

    In ASP.NET Core, ABP creates Application Services as Controllers and uses the native Authorization Filter. Since we do not rely on AuthorizationInterceptor, AbpAuthorize works even if the method is not virtual.

    In MVC5, ABP builds Dynamic Web API Controllers for the interfaces, which satisfies the first condition in AbpAuthorize attribute notes:

    • You can use it for any public method if the method is called over an interface (like Application Services used over interface).
    • A method should be virtual if it's called directly from a class reference (like ASP.NET MVC or Web API Controllers).
    • A method should be virtual if it's protected. So although the article that you came across was written for MVC5, the examples are still valid.

    I cannot change all my methods to virtual. this seems bad practice.

    Decide if you want to use interceptors, and then write the correct code for it.

    Markdown is supported
    Copy & paste or drag & drop images (max 30 MB per image)
  • User Avatar
    0
    travelsoft created

    Hi Aaron,

    Thank you for the response. Because you have mentioned filters, i've been digging around them. Turns out that is a better choice for me than interceptors. Went through the source code off abp and managed to replicate the [abpauthorize] behaviour.

    The more i learn about abp, the more i am impressed by it!

    Thank you for your help.

    Markdown is supported
    Copy & paste or drag & drop images (max 30 MB per image)
  • User Avatar
    0
    aaron created
    Support Team

    That's great :)

    Markdown is supported
    Copy & paste or drag & drop images (max 30 MB per image)