Round #710
10 May 2026, 15:10· csharp· Meta-Llama-3.3-70B-Instruct· r13-clean-hints
- Complexity
- band 0
- ZP / UO / OBS
- 2 / 5 / 3
- Journey weight
- 528
- Lightshift ΔL
- +0.25
Prompt
Implement a token refresh middleware using IMiddleware (not the convention-based one), with RequestDelegate and DelegatingHandler chained.
Zero-point index (what the engine surfaced)
ZPI-ZPI-0009 | 2026-05-10T15:10:39Z
Implement a token refresh middleware using IMiddleware (not the convention-based one), with RequestDelegate and DelegatingHandler chained.
ZERO POINT — 2 entries (structural invariants)
● hsl(314.84, 100%, 50%) IMiddleware [contract]
● hsl(280.69, 100%, 50%) RequestDelegate [contract]
UNOBSERVED — 5 entries (implied truths)
○ hsl(27.69, 100%, 50%) async [feature]
○ hsl(49.23, 100%, 50%) try [feature]
○ hsl(112.62, 100%, 38%) Token validation parameters [function]
○ hsl(31.38, 100%, 42%) Scoped registration [function]
○ hsl(44.31, 100%, 42%) IOptions of T binding [function]
OBSERVED — 3 entries (explicit in request)
◉ hsl(85.13, 100%, 50%) using [feature]
◉ hsl(98.46, 100%, 50%) with [feature]
◉ hsl(234.87, 100%, 50%) using [feature]
COMPLEXITY │ 10 entries │ spread: 207° │ band: LOW
Baseline response (no ZPI)
Here's an example implementation of a token refresh middleware using `IMiddleware` in C#.
### Token Refresh Middleware
```csharp
using Microsoft.AspNetCore.Http;
using System;
using System.Net.Http;
using System.Threading.Tasks;
public class TokenRefreshMiddleware
{
private readonly RequestDelegate _next;
private readonly IHttpClientFactory _httpClientFactory;
private readonly string _tokenEndpoint;
private readonly string _clientId;
private readonly string _clientSecret;
public TokenRefreshMiddleware(RequestDelegate next, IHttpClientFactory httpClientFactory, string tokenEndpoint, string clientId, string clientSecret)
{
_next = next;
_httpClientFactory = httpClientFactory;
_tokenEndpoint = tokenEndpoint;
_clientId = clientId;
_clientSecret = clientSecret;
}
public async Task InvokeAsync(HttpContext context)
{
var request = context.Request;
var token = await GetAccessTokenAsync();
if (token != null)
{
request.Headers.Authorization = $"Bearer {token}";
}
await _next(context);
}
private async Task<string> GetAccessTokenAsync()
{
var httpClient = _httpClientFactory.CreateClient();
var request = new HttpRequestMessage(HttpMethod.Post, _tokenEndpoint)
{
Content = new FormUrlEncodedContent(new[]
{
new KeyValuePair<string, string>("grant_type", "client_credentials"),
new KeyValuePair<string, string>("client_id", _clientId),
new KeyValuePair<string, string>("client_secret", _clientSecret),
})
};
var response = await httpClient.SendAsync(request);
if (response.IsSuccessStatusCode)
{
var tokenResponse = await response.Content.ReadAsAsync<TokenResponse>();
return tokenResponse.AccessToken;
}
return null;
}
}
public class TokenResponse
{
public string AccessToken { get; set; }
public string TokenType { get; set; }
public int ExpiresIn { get; set; }
}
```
### Delegating Handler
To chain the `DelegatingHandler` with the middleware, you can create a custom handler that refreshes the token.
```csharp
using System;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;
public class TokenRefreshHandler : DelegatingHandler
{
private readonly IHttpClientFactory _httpClientFactory;
private readonly string _tokenEndpoint;
private readonly string _clientId;
private readonly string _clientSecret;
public TokenRefreshHandler(IHttpClientFactory httpClientFactory, string tokenEndpoint, string clientId, string clientSecret)
{
_httpClientFactory = httpClientFactory;
_tokenEndpoint = tokenEndpoint;
_clientId = clientId;
_clientSecret = clientSecret;
}
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
var token = await GetAccessTokenAsync();
if (token != null)
{
request.Headers.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", token);
}
return await base.SendAsync(request, cancellationToken);
}
private async Task<string> GetAccessTokenAsync()
{
var httpClient = _httpClientFactory.CreateClient();
var request = new HttpRequestMessage(HttpMethod.Post, _tokenEndpoint)
{
Content = new FormUrlEncodedContent(new[]
{
new KeyValuePair<string, string>("grant_type", "client_credentials"),
new KeyValuePair<string, string>("client_id", _clientId),
new KeyValuePair<string, string>("client_secret", _clientSecret),
})
};
var response = await httpClient.SendAsync(request);
if (response.IsSuccessStatusCode)
{
var tokenResponse = await response.Content.ReadAsAsync<TokenResponse>();
return tokenResponse.AccessToken;
}
return null;
}
}
```
### Usage
To use the middleware and the delegating handler, you need to add them to the pipeline in the `Startup.cs` file.
```csharp
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddHttpClient("TokenRefreshClient")
.AddHttpMessageHandler<TokenRefreshHandler>();
services.AddSingleton<TokenRefreshMiddleware>();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseMiddleware<TokenRefreshMiddleware>(app.ApplicationServices.GetService<IHttpClientFactory>(), "https://example.com/token", "client_id", "client_secret");
}
}
```
Note that you need to replace the placeholders (`https://example.com/token`, `client_id`, `client_secret`) with your actual token endpoint and client credentials.
Also, make sure to register the `IHttpClientFactory` and the `TokenRefreshMiddleware` in the `ConfigureServices` method.
You can then use the `IHttpClientFactory` to create an instance of `HttpClient` that will use the `TokenRefreshHandler` to refresh the token.
```csharp
using Microsoft.AspNetCore.Mvc;
[ApiController]
[Route("api/[controller]")]
public class MyController : ControllerBase
{
private readonly IHttpClientFactory _httpClientFactory;
public MyController(IHttpClientFactory httpClientFactory)
{
_httpClientFactory = httpClientFactory;
}
[HttpGet]
public async Task<IActionResult> Get()
{
var httpClient = _httpClientFactory.CreateClient("TokenRefreshClient");
var response = await httpClient.GetAsync("https://example.com/api/data");
if (response.IsSuccessStatusCode)
{
var data = await response.Content.ReadAsStringAsync();
return Ok(data);
}
return StatusCode((int)response.StatusCode);
}
}
```
In this example, the `MyController` uses the `IHttpClientFactory` to create an instance of `HttpClient` that will use the `TokenRefreshHandler` to refresh the token. The `Get` method then uses this `HttpClient` instance to make a GET request to the API.
Enhanced response (with ZPI)
Here's an implementation of a token refresh middleware using `IMiddleware` and `DelegatingHandler`:
```csharp
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Options;
using System;
using System.Net.Http;
using System.Threading.Tasks;
public class TokenRefreshMiddleware : IMiddleware
{
private readonly RequestDelegate _next;
private readonly IOptions<TokenRefreshOptions> _tokenRefreshOptions;
private readonly HttpClient _httpClient;
public TokenRefreshMiddleware(RequestDelegate next, IOptions<TokenRefreshOptions> tokenRefreshOptions, IHttpClientFactory httpClientFactory)
{
_next = next;
_tokenRefreshOptions = tokenRefreshOptions;
_httpClient = httpClientFactory.CreateClient();
}
public async Task InvokeAsync(HttpContext context)
{
var token = context.Request.Headers["Authorization"].FirstOrDefault();
if (token != null)
{
try
{
// Validate token
var isValid = await ValidateTokenAsync(token);
if (!isValid)
{
// Refresh token
var newToken = await RefreshTokenAsync(token);
if (newToken != null)
{
// Update token in request headers
context.Request.Headers["Authorization"] = newToken;
}
else
{
// Handle token refresh failure
context.Response.StatusCode = 401;
await context.Response.WriteAsync("Token refresh failed");
return;
}
}
}
catch (Exception ex)
{
// Handle token validation exception
context.Response.StatusCode = 401;
await context.Response.WriteAsync("Token validation failed");
return;
}
}
// Call next middleware
await _next(context);
}
private async Task<bool> ValidateTokenAsync(string token)
{
// Implement token validation logic here
// For example, using a JWT library
// var jwtToken = new JwtSecurityToken(token);
// return jwtToken.ValidTo > DateTime.UtcNow;
// For demonstration purposes, assume token is valid
return true;
}
private async Task<string> RefreshTokenAsync(string token)
{
// Implement token refresh logic here
// For example, using a refresh token endpoint
var refreshToken = _tokenRefreshOptions.Value.RefreshToken;
var clientId = _tokenRefreshOptions.Value.ClientId;
var clientSecret = _tokenRefreshOptions.Value.ClientSecret;
var request = new HttpRequestMessage(HttpMethod.Post, _tokenRefreshOptions.Value.TokenEndpoint)
{
Content = new FormUrlEncodedContent(new[]
{
new KeyValuePair<string, string>("grant_type", "refresh_token"),
new KeyValuePair<string, string>("refresh_token", refreshToken),
new KeyValuePair<string, string>("client_id", clientId),
new KeyValuePair<string, string>("client_secret", clientSecret),
})
};
var response = await _httpClient.SendAsync(request);
if (response.IsSuccessStatusCode)
{
var responseBody = await response.Content.ReadAsStringAsync();
var newToken = JsonConvert.DeserializeObject<TokenResponse>(responseBody).AccessToken;
return newToken;
}
else
{
return null;
}
}
}
public class TokenRefreshOptions
{
public string TokenEndpoint { get; set; }
public string RefreshToken { get; set; }
public string ClientId { get; set; }
public string ClientSecret { get; set; }
}
public class TokenResponse
{
public string AccessToken { get; set; }
}
public class TokenRefreshMiddlewareFactory
{
public static void Configure(IServiceCollection services, Action<TokenRefreshOptions> configureOptions)
{
services.Configure(configureOptions);
services.AddHttpClient();
services.AddTransient<TokenRefreshMiddleware>();
}
}
```
To use this middleware, you'll need to register it in the `Startup.cs` file:
```csharp
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
TokenRefreshMiddlewareFactory.Configure(services, options =>
{
options.TokenEndpoint = "https://example.com/token";
options.RefreshToken = "your_refresh_token";
options.ClientId = "your_client_id";
options.ClientSecret = "your_client_secret";
});
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseRouting();
app.UseMiddleware<TokenRefreshMiddleware>();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
```
This implementation uses the `IMiddleware` interface to create a token refresh middleware that can be used in an ASP.NET Core application. The middleware checks for the presence of an `Authorization` header in the request, validates the token, and refreshes it if necessary. The token refresh logic is implemented using a `DelegatingHandler` that sends a request to a token endpoint to obtain a new token. The middleware also handles token validation and refresh failures by returning a 401 response.
Grader chain
Each grader reads the same baseline + enhanced pair and casts an independent verdict. Disagreement is the framework's own signal — not noise to be averaged away.
V1samba/Meta-Llama-3.3-70B-Instruct
BetterV4qwen2.5-coder-3b-instruct
BetterV5openrouter/qwen/qwen3-235b-a22b-2507
BetterV7qwen2.5-coder-7b-instruct
BetterV8openai/gpt-4.1
BetterV9anthropic/claude-opus-4-7
WorseV12openai/gpt-4o
BetterComments
Our grader said what it said. What do you say? Comment as a guest below.
No comments yet. Be the first to say what you make of this round.