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

标签 c# .net asp.net iis ssl

我正在尝试调试 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/

相关文章:

双击列表框中的项目后,C# 文本不显示在另一个窗体上

.net - .NET没有概念性(Fatal-)Error异常类型的设计原因?

c# - 在等待 List<Task> 中的所有任务完成时显示进度

javascript - Kentico:使用 ajax 让一个 Web 部件重新加载第二个 Web 部件

c# - Http 请求从测试服务器上的 ASP.NET 代码失败(也从 IE 失败......但不是 firefox!?)

c# - 使用 TransactionScope 的嵌套事务

c# - 初学者正则表达式替换性能问题

c# - Linq 从未在 XDocument 中找到元素

c# - 创建字符串数组时是否有更漂亮的方法来检查 DBNull?

asp.net - 单击按钮时动态添加新文本框