Обеспечение двухсекундной задержки при вызове веб-API?C#

Место общения программистов C#
Ответить
Anonymous
 Обеспечение двухсекундной задержки при вызове веб-API?

Сообщение 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);
}
}


Подробнее здесь: https://stackoverflow.com/questions/798 ... b-api-call
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»