2 回答
TA贡献1804条经验 获得超3个赞
您的问题与服务器端 C# 代码无关。由于客户端和服务器之间发生的事情(我所说的“服务器”是指 IIS、Apache、Nginx...,而不是服务器端代码),您的请求会被卡住。
在 HTTP 中,大多数客户端在发送所有请求数据之前不会读取响应。因此,即使您的服务器发现请求太大并返回错误响应,客户端也不会读取该响应,直到服务器接受整个请求。
当涉及到服务器端时,您可以检查这个问题,但我认为在客户端处理它会更方便,通过在将文件发送到服务器之前检查文件大小(这基本上是Postman在做的事情)你的情况)。
TA贡献1829条经验 获得超9个赞
你的信息确实帮助我思考如何做我想做的事。
我正在做的是:
首先,创建一个空
ByteArrayContent
请求,其中包含ContentLength
我要上传到服务器的文件的名称。二是
HttpResponseMessage = await HttpClient.SendAsync(HttpRequestMessage)
围成一圈try-catch
。该catch
块被捕获,HttpRequestException
因为我正在发送一个带有文件长度的请求,但我的实际内容长度是 0,所以它会抛出一个HttpRequestException
带有消息的Cannot close stream until all bytes are written
。如果代码到达该
catch
块,则意味着服务器允许文件大小或更大的请求。如果没有异常并且代码移动到下一行,那么如果HttpResponseMessage.StatusCode
是404,则意味着服务器拒绝大于文件大小的请求。HttpResponseMessage.StatusCode
不是404 的情况永远不会发生(不过我不确定这一点)。
到目前为止我的最终代码:
private async Task<bool> IsBigRequestAllowed() {
FileStream fileStream = File.Open("D:/Desktop/big.zip", FileMode.Open, FileAccess.Read, FileShare.Read);
if(fileStream.Length == 0) {
fileStream.Close();
return true;
}
HttpRequestMessage = new HttpRequestMessage();
HttpMethod = HttpMethod.Post;
HttpRequestMessage.Method = HttpMethod;
HttpRequestMessage.RequestUri = new Uri("https://localhost:55555/api/user/testupload");
HttpRequestMessage.Content = new ByteArrayContent(new byte[] { });
HttpRequestMessage.Content.Headers.ContentLength = fileStream.Length;
fileStream.Close();
try {
HttpResponseMessage = await HttpClient.SendAsync(HttpRequestMessage);
if (HttpResponseMessage.StatusCode == HttpStatusCode.NotFound) {
return false;
}
return true; // The code will never reach this line though
}
catch(HttpRequestException) {
return true;
}
}
注意:请注意,我的方法仍然存在问题。我的代码的问题是ContentLength属性,它不应该是文件的长度,它应该更大。例如,如果我的文件长度正好是1000字节,那么如果文件成功上传到服务器,那么Request服务器获取到的ContentLength值就更大。因为它HttpClient不仅仅发送文件的内容,还必须另外发送很多信息。它必须发送边界、内容类型、连字符、换行符等...一般来说,您应该事先找出将与文件一起发送的确切字节,HttpClient以使这种方法完美工作(我仍然不这样做)到目前为止我还不知道,我的时间已经不多了。我稍后会找出并更新我的答案)。
现在,我可以立即提前确定服务器是否可以接受与用户想要上传的文件一样大的请求。
- 2 回答
- 0 关注
- 144 浏览
添加回答
举报