gpt4 book ai didi

c# - HttpWebRequest.GetRequestStream 返回的流不会立即在 .NET Core 中发送数据

转载 作者:行者123 更新时间:2023-12-04 10:09:50 27 4
gpt4 key购买 nike

我尝试通过 htpp 发送大文件并具有以下代码:

string filePath = "";
string url = "";
using (var fileStream = new FileStream(filePath, FileMode.Open))
{

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "PUT";
request.Timeout = int.MaxValue;
request.AllowWriteStreamBuffering = false;
request.ContentLength = fileStream.Length;
request.ContentType = "video/*";
using (Stream dataStream = request.GetRequestStream())
{
byte[] buffer = new byte[1024*1024];
int bytesRead = 0;
while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)
{
dataStream.Write(buffer, 0, bytesRead);
}
}

using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
}
}

预期的行为是,一旦我在 dataStream 中写入数据,它就会通过网络发送数据。在 .NET Framework 应用程序中就是这种情况。我还在文档中的某处读到应该是这种情况。在 .NET Core 应用程序中,情况并非如此,数据似乎已完全缓冲,并且直到我调用 request.GetResponse() 才开始发送。

在一个。 NET Core 应用程序中,我在调试器中看到返回的流是一个 RequestStream,而我在 Exception 中看到了一个 MemoryStream。在 .NET Framework 应用程序中,返回的流是 ConnectStream...

有人可以重现这个吗?或者告诉我如何在 .NET 核心中获取立即发送数据的流?谢谢!

最佳答案

这似乎是 .NET Core 中的一个实际错误,因为 AllowWriteStreamBuffering 的值被忽略,只有在请求流被处理后才会发送数据。
看到这个问题:https://github.com/dotnet/runtime/issues/18632
它在 3 年内没有被修复的原因是这似乎需要一个“非平凡”的改变,因为 HttpWebRequest是已被 HttpClient 取代的旧 API ,它在优先级列表中非常低。
推荐的解决方案是切换到使用 HttpClient .假设您可以使用异步 API,您可能会以相对较少的代码获得更好的性能:

// Ideally, create the client once and reuse it
using var client = new HttpClient { Timeout = Timeout.InfiniteTimeSpan };

// StreamContent handles content length for you if you give it a seekable stream
// It'll also dispose the stream when it is itself disposed
using var content = new StreamContent(new FileStream(filePath, FileMode.Open));
content.Headers.ContentType = new MediaTypeHeaderValue("video/*");

// send it
using var response = await client.PutAsync(url, content);

// use response
response.EnsureSuccessStatusCode();
// etc.

关于c# - HttpWebRequest.GetRequestStream 返回的流不会立即在 .NET Core 中发送数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61383052/

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