Я работал над проблемой веб-API на стороне сервера, где мне нужно было добавить двухсекундную задержку. Однако мой модульный тест сообщил о следующей ошибке:
Ошибка: ожидалось, что sw.ElapsedMilliсекунды будет меньше 2000L, но обнаружено 2007L
Как видите, я даже делю время на 1000. Задержка должна была составлять ровно 2 секунды, но отмеренное время немного превысило.
[Fact]
public async Task TestGetNewsFeedOk_Cache()
{
await SeedData();
Stopwatch sw = new Stopwatch();
var response0 = await Client.GetAsync("/api/NewsFeed");
response0.StatusCode.Should().BeEquivalentTo(200);
response0.Headers.Contains("X-Cache-Miss").Should().BeTrue();
response0.Headers.Contains("X-Cache-Miss").Should().BeTrue();
var newsItems = JsonConvert.DeserializeObject
(response0.Content.ReadAsStringAsync().Result);
newsItems.Count().Should().Be(4);
sw.Start();
var response1 = await Client.GetAsync("/api/NewsFeed");
response1.StatusCode.Should().BeEquivalentTo(200);
response1.Headers.Contains("X-Cache-Hit").Should().BeTrue();
var newsItems2 = JsonConvert.DeserializeObject
(response1.Content.ReadAsStringAsync().Result);
newsItems2.Count().Should().Be(4);
sw.Stop();
// Use Floor to truncate instead of Round - 2.008 becomes 2, not 3
var elapsedRounded = (int)System.Math.Floor(sw.Elapsed.TotalSeconds / 1000);
elapsedRounded.Should().BeLessOrEqualTo(2);
}
Я использовал промежуточное программное обеспечение с задержкой ответа.
Мой вопрос: почему сервер все еще сообщал полное число, хотя мне нужно было получить только 2 секунды для подтверждения?
public class ResponseDelayMiddleware
{
private readonly RequestDelegate _next;
private readonly TimeSpan _minDelay;
public ResponseDelayMiddleware(RequestDelegate next, IOptions options)
{
_next = next;
var ms = options?.Value?.ApiDelayDuration ?? 2000;
_minDelay = TimeSpan.FromMilliseconds(ms);
}
public async Task Invoke(HttpContext context)
{
var sw = Stopwatch.StartNew();
await _next(context);
sw.Stop();
// If controller marked this as a cache-miss, ensure total time >= min delay
if (context.Response.Headers.TryGetValue("X-Cache-Miss", out var _))
{
var remaining = _minDelay - sw.Elapsed;
if (remaining > TimeSpan.Zero)
{
await Task.Delay(remaining);
}
}
}
}
Я добавил промежуточное программное обеспечение с помощью других лучших способов сделать это, насколько мне известно, чтобы всегда гарантировать ровно 2 секунды.
public void ConfigureServices(IServiceCollection services)
{
services.AddScoped();
services.AddDbContext(options => options.UseInMemoryDatabase("newsfeeddb"));
services.AddControllers();
services.AddMemoryCache();
// Bind response delay option from configuration (root key: "ApiDelayDuration" in milliseconds)
services.Configure(options =>
{
options.ApiDelayDuration = Configuration.GetValue("ApiDelayDuration", 2000);
}
}
Подробнее здесь: https://stackoverflow.com/questions/798 ... b-api-call
Обеспечение двухсекундной задержки при вызове веб-API? ⇐ C#
Место общения программистов C#
-
Anonymous
1768856632
Anonymous
Я работал над проблемой веб-API на стороне сервера, где мне нужно было добавить двухсекундную задержку. Однако мой модульный тест сообщил о следующей ошибке:
Ошибка: ожидалось, что sw.ElapsedMilliсекунды будет меньше 2000L, но обнаружено 2007L
Как видите, я даже делю время на 1000. Задержка должна была составлять ровно 2 секунды, но отмеренное время немного превысило.
[Fact]
public async Task TestGetNewsFeedOk_Cache()
{
await SeedData();
Stopwatch sw = new Stopwatch();
var response0 = await Client.GetAsync("/api/NewsFeed");
response0.StatusCode.Should().BeEquivalentTo(200);
response0.Headers.Contains("X-Cache-Miss").Should().BeTrue();
response0.Headers.Contains("X-Cache-Miss").Should().BeTrue();
var newsItems = JsonConvert.DeserializeObject
(response0.Content.ReadAsStringAsync().Result);
newsItems.Count().Should().Be(4);
sw.Start();
var response1 = await Client.GetAsync("/api/NewsFeed");
response1.StatusCode.Should().BeEquivalentTo(200);
response1.Headers.Contains("X-Cache-Hit").Should().BeTrue();
var newsItems2 = JsonConvert.DeserializeObject
(response1.Content.ReadAsStringAsync().Result);
newsItems2.Count().Should().Be(4);
sw.Stop();
// Use Floor to truncate instead of Round - 2.008 becomes 2, not 3
var elapsedRounded = (int)System.Math.Floor(sw.Elapsed.TotalSeconds / 1000);
elapsedRounded.Should().BeLessOrEqualTo(2);
}
Я использовал промежуточное программное обеспечение с задержкой ответа.
Мой вопрос: почему сервер все еще сообщал полное число, хотя мне нужно было получить только 2 секунды для подтверждения?
public class ResponseDelayMiddleware
{
private readonly RequestDelegate _next;
private readonly TimeSpan _minDelay;
public ResponseDelayMiddleware(RequestDelegate next, IOptions options)
{
_next = next;
var ms = options?.Value?.ApiDelayDuration ?? 2000;
_minDelay = TimeSpan.FromMilliseconds(ms);
}
public async Task Invoke(HttpContext context)
{
var sw = Stopwatch.StartNew();
await _next(context);
sw.Stop();
// If controller marked this as a cache-miss, ensure total time >= min delay
if (context.Response.Headers.TryGetValue("X-Cache-Miss", out var _))
{
var remaining = _minDelay - sw.Elapsed;
if (remaining > TimeSpan.Zero)
{
await Task.Delay(remaining);
}
}
}
}
Я добавил промежуточное программное обеспечение с помощью других лучших способов сделать это, насколько мне известно, чтобы всегда гарантировать ровно 2 секунды.
public void ConfigureServices(IServiceCollection services)
{
services.AddScoped();
services.AddDbContext(options => options.UseInMemoryDatabase("newsfeeddb"));
services.AddControllers();
services.AddMemoryCache();
// Bind response delay option from configuration (root key: "ApiDelayDuration" in milliseconds)
services.Configure(options =>
{
options.ApiDelayDuration = Configuration.GetValue("ApiDelayDuration", 2000);
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79871500/enforcing-a-2-second-delay-on-web-api-call[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия