C# HttpWebRequest调用GetResponse无响应

问题描述

使用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设置?有没有人碰到过?

阅读 6.5k
2 个回答

你本机开启了全局代理什么的吗?比如 ShadowSockets 之类的?关掉。

GetResponse拿出来呢?

    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;
    }
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
logo
Microsoft
子站问答
访问
宣传栏