我正在使用此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;
}
}
以下是从浏览器中获取这些方法时的相应行为:
http://localhost:62376/Order/Test1
- 200 OK
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
http://localhost:62376/Order/Test2?someParam=15
- 200 OK
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
http://localhost:62376/Order/Test3?someParam=15
- 200 OK
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
最后一次测试(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 + ")");
}
}