我正在尝试获取异常请求的参数并记录它们。如果参数是asp.net mvc中的对象,如何从请求中获取操作参数?如果我发送如下参数,我只能得到参数:
public virtual ActionResult TestAction(string A,string B){
}
但不是这样的:
public virtual ActionResult TestAction(ObjectQuery query){
}
我的代码:
protected override void OnException(ExceptionContext filterContext)
{
string action = filterContext.RouteData.Values["action"].ToString();
string controller = filterContext.RouteData.Values["controller"].ToString();
string parameters = filterContext.HttpContext.Request.QueryString
}
修改 QueryString返回空:
答案 0 :(得分:0)
您应该使用反射来实现这一目标:
var parameters = MethodBase.GetCurrentMethod().GetParameters();
foreach (ParameterInfo param in parameters)
{
//do your logging here
}
答案 1 :(得分:0)
我可能过度简化它,但您可以使用Request.Form
或Request.QueryString
获取传递给操作的参数。关于它们的好处是它们属于NameValueCollection
类型,可以很容易地将它们合并在一起。
然后在相应的控制器上抛出异常,因此您可以通过反射获取方法签名,尽管没有命名参数。
使用下面的简单代码正确地给出了传递给操作的参数,并不关心它是 POST 还是 GET 操作。
protected override void OnException(ExceptionContext filterContext)
{
//Get all the info we need to define where the error occured and with what data
var param = new NameValueCollection {Request.Form, Request.QueryString};
var controller = filterContext.RouteData.Values["controller"].ToString();
var action = filterContext.RouteData.Values["action"].ToString();
var signature = filterContext.Controller.GetType().GetMethod(action).ToString();
//Let's write it to the stream in this case
Response.Write(string.Format("<h3>Controller: {0}</h3>", controller));
Response.Write(string.Format("<h3>Action: {0}</h3>", action));
Response.Write(string.Format("<h4>Signature: {0}</h4>", signature));
foreach (var key in param.AllKeys)
{
Response.Write(string.Format("<strong>Key:</strong> {0} = {1}<br />", key, param[key]));
}
Response.End();
}
虽然我会想到一些缺点。收藏品可能会以非常不友好的方式呈现。还将显示不应与特定模型绑定的数据。