我是一名有用的助手,可以为您翻译文本。
我的问题是:当查询返回大量响应时,保护我的Web服务免于崩溃的最佳方法是什么?.NET Core最佳实践建议我不应该将响应体整个加载到字符串中,但并没有真正提出替代方案。
我希望能够优雅地失败并向客户端返回错误,而不是导致.NET服务停机,因此设置某种响应大小限制将起作用。不幸的是,所涉及的数据库服务没有返回
目前,我的Web服务器只有512MB的可用内存,我知道这不多,但我担心无论我有多少可用内存,这种错误都可能发生在大量响应上。我的主要关注点是保证我的.NET服务不会崩溃,不管来自数据库服务的响应大小如何。
我有一个C# .NET 2.2 Web服务器进程,它公开了一个API。当请求到达时,服务器需要向数据库API发出自己的HTTP请求。根据查询,数据库的响应可能非常大,在某些情况下,这足以导致我的.NET进程在日志中崩溃并显示(内存配额超限)
。
发送请求的代码如下:
string endpoint_url = "<database service url>";
var request_body = new StringContent(query, Encoding.UTF8, "<content type>");
request_body.Headers.ContentType.CharSet = "";
try {
var request_task = Http.client.PostAsync(endpoint_url, request_body);
if (await Task.WhenAny(request_task, Task.Delay(timeoutSeconds*1000)) == request_task) {
request_task.Result.EnsureSuccessStatusCode();
var response = await request_task.Result.Content.ReadAsStringAsync();
JObject json_result = JObject.Parse(response);
if (json_result["errors"] is null) {
return json_result;
} else {
// return error
}
} else {
// return timeout error
}
} catch(Exception e) {
// return error
}
我的问题是:当查询返回大量响应时,保护我的Web服务免于崩溃的最佳方法是什么?.NET Core最佳实践建议我不应该将响应体整个加载到字符串中,但并没有真正提出替代方案。
我希望能够优雅地失败并向客户端返回错误,而不是导致.NET服务停机,因此设置某种响应大小限制将起作用。不幸的是,所涉及的数据库服务没有返回
Content-Length
头,因此我无法检查。目前,我的Web服务器只有512MB的可用内存,我知道这不多,但我担心无论我有多少可用内存,这种错误都可能发生在大量响应上。我的主要关注点是保证我的.NET服务不会崩溃,不管来自数据库服务的响应大小如何。