c# - HttpWebRequest.GetRequestStream 无视 404 响应并允许写入
问题描述
在对 HTTP Post 到 RequestStream 中的问题进行故障排除时,我发现上传 4-16gb 数据几乎是瞬间发生的,只是为了让 Web 服务器报告我没有将 ContentLength 写入流。
在故障排除过程中,我注意到在wireshark 中我在请求响应流之后直接获得了fin/ack,但我无法验证在响应流中关闭此套接字。
当我最终查看 SSL 数据包时,它是从网络服务器返回的 404,但流完全不知道这个错误。
HttpWebRequest oWebrequest = (HttpWebRequest)WebRequest.Create(oUri);
oWebrequest.ContentType = "application/x-vnd.vmware-streamVmdk";
oWebrequest.Method = Method.POST.ToString();
oWebrequest.AllowWriteStreamBuffering = false;
//oWebrequest.UnsafeAuthenticatedConnectionSharing = true;
oWebrequest.ReadWriteTimeout = (int)TimeSpan.FromMinutes(30).TotalMilliseconds;
oWebrequest.Timeout = (int)TimeSpan.FromMinutes(30).TotalMilliseconds;
oWebrequest.SendChunked = false;
oWebrequest.ServerCertificateValidationCallback +=
(sender, cert, chain, error) =>
{
return true;
};
oWebrequest.MaximumResponseHeadersLength = 1024;
System.IO.FileInfo fi = new System.IO.FileInfo(filePath);
oWebrequest.ContentLength = fi.Length;
Stream RequestStream = oWebrequest.GetRequestStream();
byte[] buffer = new Byte[(uint)Math.Min(1 * 1024, fi.Length)];
using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read, buffer.Length, FileOptions.SequentialScan))
{
Int64 uploaded_bytes = 0;
int chunk_size;
double progress;
try
{
double currentProgress = 0;
// Stream the file in chunks
while ((chunk_size = fs.Read(buffer, 0, buffer.Length)) > 0)
{
RequestStream.Write(buffer, 0, (int)chunk_size);
RequestStream.Flush();
}
我本来希望在请求流写入或刷新时抛出异常以表明可能存在问题,但没有这样的发现。
所以我想知道,有没有更好、更安全的方法来上传一个大文件,并在处理网络服务器错误(如 404)方面取得进展?在被告知有问题之前将文件流的内容泵入死的 RequestStream 似乎很浪费。
解决方案
推荐阅读
- python - 如何从 QListWidget 中的可见项目创建列表
- reactjs - 使用material-ui在同一行上使用2个Typography的后续行
- javascript - 用 JS 和负数值变量范围为文本着色
- pycairo - 有人知道如何下载 pycario 吗?
- r - 如何在 R 中的线性回归中添加误差校正项
- javascript - 打开新标签后检测新标签何时完全加载
- firebase - 如何将 v-rating vuetify 的价值添加到 Firestore 中的现有文档中?
- html - 如何修复超出页面内容的高度
- javascript - 从onject生成元素后,如何根据单击的相对元素获取对象
- rust - 有没有办法使用 ext_contract 从 NEAR 中的外部合约调用 NonFungibleTokenCore?