c# – 我可以重新使用HttpWebRequest而不断开与服务器的连接吗?
我试图调试
a specific issue with my ASP.NET application.客户端运行以下代码:
void uploadFile( string serverUrl,string filePath ) { HttpWebRequest request = (HttpWebRequest)HttpWebRequest. Create( serverUrl ); CredentialCache cache = new CredentialCache(); cache.Add( new Uri( serverUrl ),"Basic",new NetworkCredential( "User","pass" ) ); request.Credentials = cache; request.Method = "POST"; request.ContentType = "application/octet-stream"; request.Timeout = 60000; request.KeepAlive = true; using( BinaryReader reader = new BinaryReader( File.OpenRead( filePath ) ) ) { request.ContentLength = reader.BaseStream.Length; using( Stream stream = request.GetRequestStream() ) { byte[] buffer = new byte[1024]; while( true ) { int bytesRead = reader.Read( buffer,buffer.Length ); if( bytesRead == 0 ) { break; } stream.Write( buffer,bytesRead ); } } } HttpWebResponse result = (HttpWebResponse)request.GetResponse(); //handle result - not relevant } 和Write()引发异常“无法将数据写入传输连接:已建立的连接被主机中的软件中止”.文本.我使用System.Net tracing,发现当我发送Content-Length设置的请求时出现问题. 具体来说,如果我省略了上述代码中的所有内容,服务器将立即通过WWW-Authenticate进行回复,然后客户端使用WWW-Authenticate重新发送请求,一切顺利,除了未上传的文件,并且请求在以后失败. 我想执行以下操作:发送没有数据的请求,等待WWW验证,然后重复使用WWW-Authenticate和数据.所以我试图修改上面的代码:首先设置所有参数,然后调用GetResponse(),然后发送,但是当我尝试设置ContentLength属性时,抛出一个异常“写入开始后不能设置该属性”文本. 所以HttpWebRequest似乎是不可重用的. 如何重新使用它来重新发送请求而不关闭连接? 解决方法
你不要重复使用请求 – 顾名思义,它是一个请求.但是,如果对同一主机发出多个请求,则.NET将默认重新使用底层网络连接.
请注意,您需要处理由request.GetResponse返回的WebResponse – 否则底层基础设施将不知道您实际上已经完成了它,并且将无法重新使用该连接. (另外,为什么要使用BinaryReader?只需直接使用File.OpenRead返回的流.) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- ruby-on-rails – 在重新启动shell Ubuntu 16后找不到RVM安
- 解决easyui tabs中href无法跨域跳转
- ruby-on-rails – 在Ruby on Rails中获得每组的前N个项目
- [Realm / React-Native debugger]:构造函数必须是’functi
- .net – 在做BDD时,首先必须TDD每条代码进行验收测试吗?
- xml 特点
- vue 监听某个div垂直滚动条下拉到底部的方法
- c# – ContextSessionSecurityToken在第二个用户登录时被覆
- ruby-on-rails – 无法修改冻结数组(TypeError) – config
- AJAX调用的自定义PHP错误