问题描述
使用post发送文件
当发送数据体长度大于100K时,调用GetResponse函数无响应,等到timeout的设置时间后,直接抛异常timeout.
如果文件较小,低于100K,无此异常.
问题出现的环境背景及自己尝试过哪些方法
本机自建IIS,本机自己的代码发送,小数据量没事,大数据量(数据体100K以上)等待设定的超时时间过后直接timeout.
但是同一份代码,在别人机子上连我的IIS毫无问题.而且我编译的文件拷贝到别人机子上连我的IIS也无问题.
post的URL在我本机的浏览器里可以正常打开,毫无问题(因为在浏览器里打开没有数据体,小数据量肯定是毫无问题的啊).
尝试过的努力
- 将http的request的keepAlive设置为false
- 把request包在try里面,每次都在finally里面close掉
- 尝试关于DefaultConnectionLimit的设置,改为为10
- UseDefaultCredentials = true
- ServicePoint.Expect100Continue = false
- AllowWriteStreamBuffering = false
- ProtocolVersion = HttpVersion.Version11
以上这些网上搜到的方法我都试过,问题依旧没有解决.
相关代码
string strBoundary = string.Empty;
byte[] postHeaderBytes = new byte[0], boundaryBytes = new byte[0];
BuildHeadFileData(ref strBoundary, ref postHeaderBytes, ref boundaryBytes);
request = WebRequest.Create(url) as HttpWebRequest;
if (request != null)
{
request.Method = "POST";
request.ContentType = "multipart/form-data;boundary=" + strBoundary;
request.UserAgent = DefaultUserAgent;
request.Proxy = null;
//request.KeepAlive = false;
request.Timeout = 30 * 1000;
request.ReadWriteTimeout = 30 * 1000;
//request.UseDefaultCredentials = true;
//request.ServicePoint.Expect100Continue = false;
//request.AllowWriteStreamBuffering = false;
//写入数据
using (Stream stream = request.GetRequestStream())
{
stream.Write(postHeaderBytes, 0, postHeaderBytes.Length);
stream.Write(paramdata, 0, paramdata.Length);
stream.Write(boundaryBytes, 0, boundaryBytes.Length);
using (WebResponse response = request.GetResponse())
{
//获取结果数据
Stream resStream = response.GetResponseStream();
StreamReader sr = new StreamReader(resStream, System.Text.Encoding.UTF8);
string success = sr.ReadToEnd();
return success;
}
}
}
private void BuildHeadFileData(ref string strBoundary, ref byte[] HeaderBytes, ref byte[] boundaryBytes)
{
// 边界符
strBoundary = "----------" + DateTime.Now.Ticks.ToString("x");
boundaryBytes = Encoding.ASCII.GetBytes(string.Format("\r\n--{0}--\r\n", strBoundary));
StringBuilder sb = new StringBuilder();
sb.Append("--");
sb.Append(strBoundary);
sb.Append(Environment.NewLine);
sb.Append("Content-Disposition: form-data; name=\"");
sb.Append("file");
sb.Append("\"; filename=\"");
sb.Append("fileData");
sb.Append("\"");
sb.Append(Environment.NewLine);
sb.Append("Content-Type: ");
sb.Append("application/octet-stream;");
sb.Append(Environment.NewLine);
sb.Append(Environment.NewLine);
HeaderBytes = Encoding.UTF8.GetBytes(sb.ToString());
}
using (WebResponse response = request.GetResponse())每次就是运行到这一句,等待我设置的request.Timeout = 30 * 1000时间以后就直接抛异常,异常信息就是显示timeout
你期待的结果是什么?实际看到的错误信息又是什么?
在我的理解里,别人用我发布的版本连我的IIS没问题,那么我得IIS设置应该没问题,不存在服务器设置只能接收100K的数据限制.
而别人从SVN上下载一份一样的代码,编译运行能正常使用,说明代码本身应该也没问题啊.
我编译的版本给别人连我的IIS也没问题,那说明我机子的net framework底层库应该也是好的.
我们两个人都是win10系统,也不存在系统差异.
那么问题在哪?网卡设置?windows设置?有没有人碰到过?
你本机开启了全局代理什么的吗?比如 ShadowSockets 之类的?关掉。