ASP.NET Core Minimal API中如何通过HttpRequestMessage获取路由名称
如何在ASP.NET Core Minimal API中根据HttpRequestMessage获取对应路由名称
我希望测试ASP.NET Core Minimal API的WebApplication路由功能,请问如何根据给定的HttpRequestMessage获取对应的路由名称?
初始代码示例
var builder = WebApplication.CreateBuilder(args); builder.Services.AddRouting().Configure<RouteOptions>(options => {}); var app = builder.Build(); app.MapGet("/hello", () => "Hello!").WithName(RouteNames.Hello); app.MapGet("/world", () => "World!").WithName(RouteNames.World); //app.Run(); var request = new HttpRequestMessage(HttpMethod.Get, "/world"); var routeName = GetRouteName(app, request); Console.WriteLine($"routeName: {routeName}"); string? GetRouteName(WebApplication app, HttpRequestMessage request) { return null; // TODO: Implement } static class RouteNames { public const string Hello = "Hello"; public const string World = "World"; }
目前官方暂未提供直接通过HttpRequestMessage获取路由名称的原生API。
可行实现方案
可以通过Microsoft.AspNetCore.TestHost包来实现,首先添加包引用:
<PackageReference Include="Microsoft.AspNetCore.TestHost" Version="7.0.5" />
完整可行代码如下:
using Microsoft.AspNetCore.TestHost; using System.Diagnostics; var host = new HostBuilder() .ConfigureWebHost(webHost => webHost.UseTestServer().Configure(app => { app.UseRouting(); app.Use((context, next) => { if (context.GetEndpoint() is Endpoint endpoint) { var endpointName = endpoint.Metadata.GetMetadata<IEndpointNameMetadata>()?.EndpointName; if (endpointName != null) { context.Response.Headers.Add(TagKeys.EndpointName, endpointName); } } return next(); }); app.UseEndpoints(endpoints => { endpoints.MapGet("/hello", () => "Hello!").WithName(RouteNames.Hello); endpoints.MapGet("/world", () => "World!").WithName(RouteNames.World); }); }) .ConfigureServices(services => { services.AddRouting().Configure<RouteOptions>(routeOptions => { }); } ) ).Build(); host.Start(); var httpClient = host.GetTestClient(); await PrintEndpointName(httpClient, new HttpRequestMessage(HttpMethod.Get, "/")); await PrintEndpointName(httpClient, new HttpRequestMessage(HttpMethod.Get, "/hello")); await PrintEndpointName(httpClient, new HttpRequestMessage(HttpMethod.Get, "/world")); async Task PrintEndpointName(HttpClient httpClient, HttpRequestMessage request) { var httpResponse = await httpClient.SendAsync(request); IEnumerable<string>? headers; httpResponse.Headers.TryGetValues(TagKeys.EndpointName, out headers); var endpointName = headers?.FirstOrDefault(); Debug.WriteLine($"{((int)httpResponse.StatusCode)} {endpointName}"); } static class RouteNames { public const string Hello = "Hello"; public const string World = "World"; } static class TagKeys { public const string EndpointName = "endpoint.name"; }
内容的提问来源于stack exchange,提问作者Cameron Taggart
相关产品推荐
相关产品推荐

