C# 我可以在不与服务器断开连接的情况下重用HttpWebRequest吗?

C# 我可以在不与服务器断开连接的情况下重用HttpWebRequest吗?,c#,.net,asp.net,iis,ssl,C#,.net,Asp.net,Iis,Ssl,我正在试着调试。客户端运行以下代码: void uploadFile( string serverUrl, string filePath ) { HttpWebRequest request = (HttpWebRequest)HttpWebRequest. Create( serverUrl ); CredentialCache cache = new CredentialCache(); cache.Add( new Uri( serverUrl )

我正在试着调试。客户端运行以下代码:

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, 0, buffer.Length );
                if( bytesRead == 0 ) {
                    break;
                }
                stream.Write( buffer, 0, bytesRead );
            }
        }
    }

     HttpWebResponse result = (HttpWebResponse)request.GetResponse();
     //handle result - not relevant
 }
Write()
引发异常,其中包含“无法将数据写入传输连接:已建立的连接被主机中的软件中止。”文本。我使用并发现当我发送设置了
Content-Length
的请求时出现了问题

特别是,如果我在上面的代码中使用语句省略了
中的所有内容,服务器会立即使用
WWW-Authenticate
回复请求,然后客户端使用
WWW-Authenticate
重新提交请求,除未上载的文件外,所有内容都会正常进行,请求会在很久之后失败

我想执行以下操作:发送不带数据的请求,等待
WWW-Authenticate
,然后使用
WWW-Authenticate
和数据重复该操作。因此,我尝试修改上面的代码:首先设置所有参数,然后调用
GetResponse()
,然后执行发送,但当我尝试设置
ContentLength
属性时,会引发异常,并显示“开始写入后无法设置此属性”文本

因此
HttpWebRequest
似乎是不可重用的


如何在不关闭连接的情况下重用它来重新发送请求?

您不会重用请求-顾名思义,它只是一个请求。但是,如果您对同一主机发出多个请求,默认情况下,.NET将重用基础网络连接

请注意,您确实需要处理由
request.GetResponse
返回的
WebResponse
——否则底层基础结构将不知道您实际上已经使用了它,并且无法重用连接


(顺便提一下,为什么要使用
BinaryReader
?只需直接使用
File.OpenRead
返回的流即可。)

除了Jon Skeet的答案之外,您不需要手动设置ContentLength属性。HttpWebRequest将自动计算并填充该属性。

我可以担保WebResponse处理。我没有在我的一个应用程序中处理WebResponse,它导致了严重的内存泄漏,因为我正在实例化几个HttpWebRequests。公平,但是,我还可以使用什么机制来解决我的问题呢?特别是我需要获得身份验证,然后重新使用相同的
WWW Authenticate
?@sharptooth:不清楚为什么不能从响应中获取头并在下一个请求中使用它。为什么你认为你必须重用同一个对象?好吧,我想如果服务器使用类似于Digest-MD5的nonce,那么它将是偏执的-nonce将只对同一个连接有效,这样就没有第三方可以监听它并将自己模拟为真正的客户机。这就是为什么我认为我需要保持TCP连接打开的原因。@sharptooth:我不希望这样。HTTP并不是为此而设计的——它被设计为一个请求/响应协议,重用相同的连接应该是一个实现细节。(正如我所说,它可能会使用相同的连接,但你不应该真的去想。)我也有同样的问题。如果您得到了解决方案,请提供或显示修改后的新代码,这将对我有所帮助。@Herin:如果您使用nonce身份验证,则没有解决方案。如果您使用基本身份验证之类的方法,您可以只设置“授权”标题,这样就不会出现
WWW-Authenticate
阶段。但在“stream.Write(buffer,0,bytesRead)”行出现错误,那么解决方案是什么呢。请您提供修改后的代码,以便我能更好地理解。Thanks@Herin字体那是很久以前的事了,我几乎不记得细节了。我想你最好的办法是问一个单独的问题,把你的情况详细地说出来。