我有一个基于MVC3(无测试版或发布候选版本,RTM/RTW版本)的Web应用程序,它具有接受要处理的XML文件的操作。MVC3 AllowHtml属性问题
当然,由于可能的攻击,这对于MVC来说似乎是邪恶的,所以它不允许它。好吧,我尽量把要么AllowHtml模型对象上,例如:
public class XMLModel
{
[AllowHtml]
public string msg { get; set; }
}
或者我设置ValidateInput为false对我的操作方法,如这样的:
[ValidateInput(false)]
public ActionResult AddCDR(XMLModel model)
{
}
之所以有“强烈“首先,类型化模型是我最初尝试将一个名为”msg“的字符串值作为操作方法参数,但总是返回空。
现在,当某人发布到此表单时,无论是在同一台机器上还是从联网的计算机上,msg字段始终为空。
我已通过WireShark验证数据实际上是在请求中。
现在,一件有趣的事情。 这对于MVC 3不应该是必需的。然而它有一点点不同。
如果我添加这对我的web配置:
<httpRuntime requestValidationMode="2.0" />
它适用于从本地计算机发起的请求,但它不会从其他系统工作。
我认为AllowHtml版本看起来很优雅 - 只要它有效。
我也发现了在RC2中的错误 - 再次,这不应该影响我,但我尝试添加以下的的Application_Start()反正:
ModelMetadataProviders.Current = new DataAnnotationsModelMetadataProvider();
正如预期的那样,它没有真正的区别。
在我的开发计算机(Win7x64,VS2010)上一切正常,但在目标系统上(Win2008R2x64,IIS7.5),上述问题给我一个很难的时间。
很重要的一点要注意:如果我发布到没有尖括号的动作,我得到预期的表单数据。但是,只要尖括号出现,我的动作根本不会被调用,或者它找不到表单数据,无论是在操作方法参数中还是在例如Request.Params [“msg”]中应该。
任何允许XML通过的想法?
UPDATE
我试图解决这个我的方式在等待任何人都可以想出一个答案在这里。我还没有能够解决它,但我已经检查了一些额外的细节;
- 首先,我验证了安装在我的开发计算机和Web服务器上的ASP.NET MVC 3版本是相同的; v3.0.20105.0(根据添加/删除程序)。
- Web应用程序实际上是使用MVC3测试版创建的,然后在它们出来时转换为RC1和RC2,最后转换为RTM版本。这意味着我必须修改一些代码,因为ViewBag发生了变化。然而,由于我不知道到底发生了什么变化,我创建了一个带有RTM版本的全新MVC3应用程序,使用相同的操作方法创建了一个具有相同名称的控制器,并使用与当前使用的模型对象类似的模型对象,重新命名旧的网络应用程序目录,并将其放置到位。完全相同的事情发生 - 即,当从本地机器发出请求时,具有AllowHtml属性的参数会与所有内容一同传递,但如果它来自远程机器,则HTML(实际上是XML)会被剥离。
- 没有例外。我已经安装了Elmah并验证了这一点 - 没有发生异常,我的操作方法显然只是调用任何看起来像XML从参数中剥离出来的方法。
不用说,这是推动我疯了。我昨天有一些建议,看看MVC3的源代码,但不幸的是,这并没有真正帮助我,因为我看不出有什么明显的错误,并且我无法在有问题的服务器上调试代码。
任何见解仍然非常期望,谢谢! :)
谢谢布拉德,非常感谢!我自己已经取得了一些进展,并且希望今天能够确定一些解决方案。 – 2011-02-01 13:11:37