Asp.net mvc 是不是;好",;在非HTTP-200响应中返回HTML标记?

Asp.net mvc 是不是;好",;在非HTTP-200响应中返回HTML标记?,asp.net-mvc,partial-views,http-status-codes,Asp.net Mvc,Partial Views,Http Status Codes,假设您在页面上有一个表单,并以AJAXian方式将该表单的数据发布到服务器,例如jQuery.POST()。服务器判断数据无效,因为电子邮件地址不包含“@”符号 我认为HTTP的精神是说服务器应该返回一个“HTTP 400错误请求”状态代码及其响应,以指示客户端它无法处理该请求。原因(数据未验证)应在响应正文中 但是我在一个ASP.NETMVC环境中工作,该环境传统上实现了“部分视图”——作为响应发送的HTML片段,当从AJAX请求接收时,将替换到客户端的DOM中。在此范例中,服务器通常构造表单

假设您在页面上有一个表单,并以AJAXian方式将该表单的数据发布到服务器,例如jQuery.POST()。服务器判断数据无效,因为电子邮件地址不包含“@”符号

我认为HTTP的精神是说服务器应该返回一个“HTTP 400错误请求”状态代码及其响应,以指示客户端它无法处理该请求。原因(数据未验证)应在响应正文中

但是我在一个ASP.NETMVC环境中工作,该环境传统上实现了“部分视图”——作为响应发送的HTML片段,当从AJAX请求接收时,将替换到客户端的DOM中。在此范例中,服务器通常构造表单的替代版本,用(无效)提交的值填充,并用红色突出显示和警报样式,指示电子邮件地址无效,应该更正。客户机将该表单替换到其DOM中,用户看到了问题所在

在MVC世界中,这是一种非常常见的模式,但我看不到有人注意设置适当的HTTP状态代码。我不明白为什么


在非HTTP-200响应中包含HTML标记以便客户端显示验证是否“可以”?我找不到任何说明它不是的内容。

取决于返回的状态码以及您打算如何使用它,但通常您可以。

如果您知道响应可以解析,请发送一个json/xml文档,其中包含正确的mime类型和信息。否则只发送一个人类可读的HTML内容。在这两种情况下,显然都设置了正确的HTTP状态代码。

“我不知道为什么。”我只想对此发表评论:有时,所有错误状态代码都映射到状态代码
200
,这是一般总体安全问题的一部分-出于同样的原因,您不希望攻击者看到stacktraces,有时,如果请求破坏了错误代码,或者内部服务器错误破坏了错误代码,或者任何“详细”的内容,您也不希望错误代码传达出来。(续)因此您可以将允许范围之外的所有内容映射到
200
。经常选择
200
的原因有两个:(1)因为选择一个错误代码,可以作为
4xx
/
5xx
的总括包装,其实并不简单;(2) 因为它迫使自动攻击工具分析消息体,看看它们是否击中了什么东西。(继续)这当然是默默无闻的安全,但据我所知,这是相当普遍的。所以也许这就是人们的“动机”。同样,他们可能只是没有考虑一下(状态代码映射通常在Web服务器级别完成,因此应用程序本身可以发送它想要的任何东西)。