您的位置:首页 > 大数据 > 人工智能

针对错误 “服务器提交了协议冲突. Section=ResponseHeader Detail=CR 后面必须是 LF” 的原因分析

2017-04-27 16:42 567 查看
执行http的文件下载有一段代码需要发送http HEAD请求通过反馈解析得到下载文件服务器的文件名称【为了避免请求数据量过大所以只要HEAD头其他信息不要减少时间消耗】

public static string GetDownloadFileServerName(string url)
{
//SetAllowUnsafeHeaderParsing(true);
string filename = "";
try
{
if (string.IsNullOrEmpty(url))
return filename;
var req = WebRequest.CreateDefault(new Uri(url)) as HttpWebRequest;
req.Method = "HEAD";
req.Timeout = 10000;
var res = req.GetResponse() as HttpWebResponse;
if (res.StatusCode == HttpStatusCode.OK)
{
filename = res.GetResponseHeader("Content-Disposition");//获取文件名
if (filename.IndexOf("filename=") > 0)
filename = filename.Substring(filename.IndexOf("=") + 1);
}
res.Close();
}
catch (WebException wex)
{
log.Error(wex.Message.ToString());
}
return filename;
}


但在测试过程中catch异常跑出 “服务器提交了协议冲突. Section=ResponseHeader Detail=CR 后面必须是 LF” 网上一大堆的解决方案,但处理方式都是一致的:

解决方案:winfrom 在app.config种添加 web 在 web.config种添加

但自我感觉以这种客户端采用关闭安全头部解析来进行规避不是解决问题的根本办法于是通过查询相关资料了解该异常的根本原因与HTTP的HEAD头信息规范 https://msdn.microsoft.com/zh-cn/library/system.net.configuration.httpwebrequestelement.useunsafeheaderparsing http://www.360doc.com/content/11/0113/20/3508740_86319358.shtml https://my.oschina.net/EricWe/blog/126844 http://www.360doc.com/content/10/0930/17/3668821_57590979.shtml
通过综合信息的分析基本可以确定是web服务器在文件下载处理上有问题,只能通过Wireshark 抓包进行确认,首先分析ResponseHeader 头部是否符合规则 意外发现ETag中存在乱码





这就是造成HTTP 头部解析失败的原因了,该信息因为服务器在处理MD5字符未采用常规转化造成主要应用于断点续传

违反了下方的规则,但错误提示违反的是第一条规则走了些弯路,所以在解决问题的同时应该依靠实际场景进行具体分析才能更准确的定位问题



希望可以帮助到遇到相同问题的码友们,在此感谢
http://www.cnblogs.com/uu102/p/3671778.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐