Eine Verzögerung von 2 Sekunden beim Web-API-Aufruf erzwingen?C#

Ein Treffpunkt für C#-Programmierer
Anonymous
 Eine Verzögerung von 2 Sekunden beim Web-API-Aufruf erzwingen?

Post by Anonymous »

Ich arbeitete an einem serverseitigen Web-API-Problem, bei dem ich eine Verzögerung von 2 Sekunden hinzufügen musste. Allerdings meldete mein Komponententest den folgenden Fehler:

Fehler: Erwartete sw.ElapsedMilliseconds kleiner als 2000L, aber 2007L gefunden

Wie Sie sehen können, teile ich die Zeit sogar durch 1000. Die Verzögerung sollte genau 2 Sekunden betragen, aber Die gemessene Zeit war etwas überschritten.

Code: Select all

[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);
}
Ich habe eine Antwortverzögerungs-Middleware verwendet.
Meine Frage: Warum meldete der Server immer noch die vollständige Zahl, obwohl ich nur 2 Sekunden Zeit hätte haben sollen, um mich dagegen zu behaupten?

Code: Select all

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);
}
}
}
}
Ich habe die Middleware über ihre anderen besseren Möglichkeiten hinzugefügt, um meines Wissens nach immer genau 2 Sekunden sicherzustellen.

Code: Select all

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);
}
}

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post