mvc - request.params的第一个“get”结果得到异常,第二个“get”就可以了

时间:2012-08-19 11:14:16

标签: asp.net-mvc exception http-post dangerous-request

mvc - request.params的第一个“get”结果获得异常,第二个“get”就可以了。 我有一个页面,其中包含一个包含xml文本的字段。 我正在使用validation = false。 但是,在控制器中的post方法我试图得到requset.params,我得到一个错误 “从客户端检测到一个潜在危险的Request.Form值”。经过一些挖掘和调试后,我看到第一次尝试获取request.params我得到一个异常,但是当我第二次尝试得到它时一切正常。

这是我用来避免xml问题的过滤器(我将其转换为二进制数据并清空xml字符串字段):

   public class RestAPIAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
                 ((SimulationModel)filterContext.ActionParameters["model"]).Data = CommonConverters.StringToByteArray(((SimulationModel)filterContext.ActionParameters["model"]).StringData);
            ((SimulationModel)filterContext.ActionParameters["model"]).StringData = string.Empty;


            base.OnActionExecuting(filterContext);
        }
    }

这是post方法:

   [HttpPost]
    [ValidateInput(false)]
    [RestAPIAttribute]
    public ActionResult EditSimulation(Guid id, SimulationModel model)
    {
        try
        {
            model.RelationModel = new RelationModel(false, this.Resource("Simulations.AddToObjects"), "SimulationToObjects", id, sessionId, Request.Params, new List<ObjectTypes>() { ObjectTypes.Entity, ObjectTypes.EntityType, ObjectTypes.Universe });
        }
        catch (Exception ex)
        {
            Logger.LogException(ex);
        }

        /* more code here*/

        return View(newModel);
    }

现在,你可以看到RelationModel的一个constuctor有一个request.param参数给了我这个问题。

我目前解决此问题的方法只是调用它两次(但我正在寻找更好的解决方案或至少是解释):

   [HttpPost]
    [ValidateInput(false)]
    [RestAPIAttribute]
    public ActionResult EditSimulation(Guid id, SimulationModel model)
    {
        try
        {
             try
            {
                model.RelationModel = new RelationModel(false, this.Resource("Simulations.AddToObjects"), "SimulationToObjects", id, sessionId, Request.Params, new List<ObjectTypes>() { ObjectTypes.Entity, ObjectTypes.EntityType, ObjectTypes.Universe });
            }
            catch
            {
                model.RelationModel = new RelationModel(false, this.Resource("Simulations.AddToObjects"), "SimulationToObjects", id, sessionId, Request.Params, new List<ObjectTypes>() { ObjectTypes.Entity, ObjectTypes.EntityType, ObjectTypes.Universe });
            }
        }
        catch (Exception ex)
        {
            Logger.LogException(ex);
        }

        /* more code here*/

        return View(newModel);
    }

1 个答案:

答案 0 :(得分:1)

如果这是ASP.NET MVC 3+,您可以在包含XML的模型属性上使用[AllowHtml]属性。这将仅禁用此属性的请求验证,而不是整个请求:

public class SimulationModel 
{ 
    [AllowHtml]
    public string StringData { get; set; } 
}

然后:

[HttpPost]
public ActionResult EditSimulation(Guid id, SimulationModel model)
{
    // you could directly use model.StringData here without any 
    // encoding needed

    return View(newModel);
}

如果这是在ASP.NET 4.0中运行的ASP.NET MVC 2应用程序,除了使用[ValidateInput(false)]属性修改控制器操作外,您可能需要将以下内容放在web.config中:

<httpRuntime requestValidationMode="2.0"/>

如果是ASP.NET MVC 3应用程序,则无需将此行放在web.config中以使用[ValidateInput(false)]属性。