我正在测试一些不同的公共RESTful API,每个API在http参数值名称上都不同,但在概念上所有工作都类似。然而,没有一家公司是连接在一起的,所以它必须是我的最终目标。
在.NET中,我在尝试获取HttpWebResponse时遇到以下错误:
消息:“服务器提交了协议违规.Section = ResponseStatusLine”
状态:ServerProtocolViolation {11}
使用Fiddler,我发现返回的标题不存在,这就是问题的原因(甚至不存在和格式不正确):
HTTP / 1.0 200这个错误的服务器没有返回标题
我发送的参数是一篇冗长的文字新闻文章。我已经删除所有 puntuation,字符等只是以确保没有任何干扰。我使用StringBuilder构建文本,然后创建如下所示的URI:
Dim sb As New StringBuilder
sb.Append("&apiKey=" + HttpUtility.UrlEncode("123456789"))
sb.Append("&inputText=" + HttpUtility.UrlEncode(Me.MyTestText))
Dim ApiHttpWebRequest As HttpWebRequest = CType(WebRequest.Create(New Uri(BaseRequestURL + sb.ToString.Trim())), HttpWebRequest)
Dim ApiHttpWebResponse As HttpWebResponse = CType(ApiHttpWebRequest.GetResponse(), HttpWebResponse)
此代码 DOES 适用于我发送的大多数文字。我发现有趣的是,如果我缩短我发送的文本,那么它的工作原理!我无法弄明白完全的威胁或断点。在针对它运行HttpUtility.UrlEncode函数之后,stringbuilders值会展开。但是,文本大小只有大约5-8千字节,远远低于MSDN 或中任何一个的“httpWebRequest”.config设置所规定的任何大小限制。我正在使用的API(例如1个限制是150千字节的文本)。我甚至尝试在web.config中将所有这些值设置为“-1”,这意味着:“值为-1表示不会对响应标头施加大小限制。”
http参数值的大小是否存在限制,或者我在这里丢失的其他任何内容都会导致这种情况发生限制?谢谢!
答案 0 :(得分:2)
答案 1 :(得分:2)
当我发布问题时,问题会受到惊吓,并提出解决方案;)
感谢上一个链接,但由于我没有直接在浏览器中执行此操作,因此在我的情况下,这些限制不是问题。
我使用HttpWebRequest的defualt'Method'值是“GET”,我应该使用“POST”,原因有几个,包括征服请求问题的长度。因此,在创建Request对象后添加以下代码行,修复了问题:
ApiHttpWebRequest.Method = "POST"
此链接(旧但内容仍然有效)也很有帮助:
QueryString / GET / URL参数的限制是什么?:
http://classicasp.aspfaq.com/forms/what-is-the-limit-on-querystring/get/url-parameters.html
......以及TechNet的一个很好的描述:
“前面的示例中使用的GET方法将名称/值对附加到URL。不幸的是,URL的长度是有限的,因此只有少数几个参数才能使用此方法。如果表单使用大量参数,或者参数包含大量数据,则URL可能被截断。此外,在URL上传递的参数在浏览器的地址字段中可见,而不是密码的最佳位置显示。
GET方法的替代方法是POST方法。此方法将名称/值对打包在HTTP请求的正文中,这样可以生成更清晰的URL,并且对表单输出不施加任何大小限制。它也更安全。“