我在ASP.NET MVC中丢失帖子数据时遇到了一些问题,这导致我调查ASP.NET MVC如何处理无效的内容长度。我曾假设MVC.NET应忽略内容长度无效的帖子,但似乎并非如此。
例如,尝试创建一个新的ASP.NET MVC 2 Web应用程序并将此操作添加到HomeController:
public ActionResult Test(int userID, string text)
{
return Content("UserID = " + userID + " Text = " + text);
}
尝试创建一个发布到上述操作的简单表单,运行fiddler并(使用“Request Builder”)修改原始数据,以便丢失一些表单数据(例如删除text参数)。在执行请求之前,请记住取消勾选Request Builder选项下的“Fix Content-Length header”复选框,然后在上面的代码上设置断点并执行自定义http请求。
我发现请求需要的时间比正常情况要长很多(大约30秒),但令我惊讶的仍然是控制器操作。有谁知道这是否是预期的行为,如果是的话,你会建议什么来防止无效的内容长度?
答案 0 :(得分:2)
ASP.NET不会忽略Content-Length
请求标头。将以下控制器操作视为一个示例,它只回显foo
参数:
[HttpPost]
public ActionResult Index(string foo)
{
return Content(foo, "text/plain");
}
现在让我们向它发出有效的POST请求:
using (var client = new TcpClient("127.0.0.1", 2555))
using (var stream = client.GetStream())
using (var writer = new StreamWriter(stream))
using (var reader = new StreamReader(stream))
{
writer.Write(
@"POST /home/index HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Host: localhost:2555
Content-Length: 10
Connection: close
foo=foobar");
writer.Flush();
Console.WriteLine(reader.ReadToEnd());
}
正如预期的那样,它会打印响应HTTP标头(这些标头并不重要),并在正文中打印foobar
。现在尝试减少请求的Content-Length
标题:
POST /home/index HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Host: localhost:2555
Content-Length: 5
Connection: close
foo=foobar
在响应正文中返回单个f
。因此,您可以看到无效的HTTP请求可能导致对参数的解析不正确。