Spring.NET AOP记录可选参数问题

时间:2014-10-23 15:01:36

标签: asp.net-mvc spring-aop spring.net

我正在使用此SO答案中描述的设置:Unobtrusive AOP with Spring.Net和基于q9114762_aop_on_mvc_controllers on GitHub的源代码来获取控制器的AOP日志记录。

除非在没有可选参数的情况下调用带有可选参数的控制器方法,否则一切都很好。

我的测试方法:

using System.Web.Mvc;

public class OrderController : Controller
{
   [SetMethodInfoAsMessage]
   virtual public ActionResult Test1()
   {
       return null;
   }

    [SetMethodInfoAsMessage]
    virtual public ActionResult Test2(int someParam = 0)
    {
        return null;
    }

    [SetMethodInfoAsMessage]
    virtual public ActionResult Test3(int? someParam = 0)
    {
        return null;
    }

    [SetMethodInfoAsMessage]
    virtual public ActionResult Test4(int someParam)
    {
        return null;
    }
}

以下是从浏览器中获取这些方法时的相应行为:

  1. http://localhost:62376/Order/Test1 - 200 OK

  2. http://localhost:62376/Order/Test2 - 500 Internal Server Error. Server Error in '/' Application. The parameters dictionary contains an invalid entry for parameter 'someParam' for method 'System.Web.Mvc.ActionResult Test2(Int32)' in 'InheritanceAopProxy_7b93ae81d25d46529bebc7ed00ebc409'. The dictionary contains a value of type 'System.Reflection.Missing', but the parameter requires a value of type 'System.Int32'. Parameter name: parameters

  3. http://localhost:62376/Order/Test2?someParam=15 - 200 OK

  4. http://localhost:62376/Order/Test3 - 500 Internal Server Error. Server Error in '/' Application. The parameters dictionary contains an invalid entry for parameter 'someParam' for method 'System.Web.Mvc.ActionResult Test3(System.Nullable1[System.Int32])' in 'InheritanceAopProxy_7b93ae81d25d46529bebc7ed00ebc409'. The dictionary contains a value of type 'System.Reflection.Missing', but the parameter requires a value of type 'System.Nullable1[System.Int32]'. Parameter name: parameters

  5. http://localhost:62376/Order/Test3?someParam=15 - 200 OK

  6. http://localhost:62376/Order/Test4 - 500 Internal Server Error. Server Error in '/' Application. The parameters dictionary contains a null entry for parameter 'someParam' of non-nullable type 'System.Int32' for method 'System.Web.Mvc.ActionResult Test4(Int32)' in 'InheritanceAopProxy_7b93ae81d25d46529bebc7ed00ebc409'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter. Parameter name: parameters

  7. 最后一次测试(6.)是有道理的,因为someParam是强制性的。但是我们可以从2和4看到,不提供可选参数会产生500.另外需要注意的是来自4的错误文本。 - 可选参数必须是引用类型,可以为空的类型,或者被声明为可选参数。所以根据这个,4。应该工作,对吗? (因为Test3的可选参数可以为空)。

    还有其他人经历过这个吗?任何人都有任何关于解决方法的建议(除了手动将日志语句添加到方法中)?

    这是使用Spring.Aop 1.3.2,Spring.Core 1.3.2,Spring.Web。 1.3.2和Spring.Web.Mvc3 1.3.2。

    编辑:根据要求,这是建议。它只是记录了除密码之外的args(我们不希望那些记录):

    public class SetMethodInfoAsMessageAdvice : IMethodBeforeAdvice //, IThrowsAdvice
    {
        private static readonly PELogger log = Log4NetHelper.GetLogger(typeof(SetMethodInfoAsMessageAdvice));
    
        public void Before(MethodInfo m, object[] args, object target)
        {
            ILog logger = LogManager.GetLogger(m.DeclaringType);
    
            string dump = args.ToJson();
            if (dump.Contains("password", StringComparison.OrdinalIgnoreCase))
                dump = "<password hidden>";
    
            logger.Info(m.Name + "(" + dump + ")");
       }
    }
    

0 个答案:

没有答案