gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 17:37:20 26 4
gpt4 key购买 nike

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

HttpWebResponse result = (HttpWebResponse)request.GetResponse();
//handle result - not relevant
}

Write() 抛出异常“无法将数据写入传输连接:已建立的连接已被主机中的软件中止。”文本。我用了System.Net tracing并发现当我发送设置了 Content-Length 的请求时出现了问题。

具体来说,如果我在上面的代码中省略了 using 语句中的所有内容,服务器会立即使用 WWW-Authenticate 进行回复,然后客户端使用 重新发布请求WWW-Authenticate 一切正常,除了文件未上传且请求稍后失败。

我想执行以下操作:发送一个没有数据的请求,等待 WWW-Authenticate,然后用 WWW-Authenticate 和数据重复它。所以我尝试修改上面的代码:首先设置所有参数,然后调用 GetResponse(),然后发送,但是当我尝试设置 ContentLength 属性时出现异常抛出“写入开始后无法设置此属性”文本。

所以 HttpWebRequest 似乎是不可重用的。

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

最佳答案

您不会重复使用请求 - 顾名思义,这是一个请求。但是,如果您对同一主机发出多个请求,.NET 将默认重用底层网络连接。

请注意,您确实需要处理 request.GetResponse 返回的 WebResponse - 否则底层基础架构将不知道您'实际上已经完成了它,并且将无法重用该连接。

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

关于c# - 我可以在不断开与服务器的连接的情况下重用 HttpWebRequest 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4933450/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com