我有一个具有现有 FastEndpoints REST API 的项目。没什么特别的,几乎是默认配置:
app.UseFastEndpoints(x => {
x.Endpoints.Configurator = definition => {
definition.Description(desc => desc.ProducesProblemFE<CommonErrorResponse>(500));
definition.Description(desc => desc.ProducesProblemFE<ErrorResponse>());
};
x.Endpoints.Filter = ep => true;
});
现在我想添加 Duende IdentityServer,我想这并不重要,因为真正的问题是这个包的 Razor 页面。再说一遍,没什么特别的:
builder.Services.AddRazorPages();
现在的问题是,Razor 页面优先于 REST API。这意味着,如果我想转到
GET users/self
,我会看到一个剃刀页面,而不是正确的数据或 HTTP 错误。
所以我想做的是以下其中一项:
我在这两个框架上都找不到任何东西(只有 MVC 的解决方案),所以我在这里问:我该怎么做?
以下中间件顺序似乎有效:
var bld = WebApplication.CreateBuilder(args);
bld.Services
.AddFastEndpoints()
.AddRazorPages();
var app = bld.Build();
if (!app.Environment.IsDevelopment())
app.UseExceptionHandler("/Error");
app.UseRouting()
.UseAuthorization()
.UseFastEndpoints();
app.MapStaticAssets();
app.MapRazorPages()
.WithStaticAssets();
app.Run();
测试终点:
sealed class TestEndpoint : EndpointWithoutRequest
{
public override void Configure()
{
Get("test");
AllowAnonymous();
}
public override async Task HandleAsync(CancellationToken c)
{
await SendAsync("hello...");
}
}
向
/test
发出 get 请求会显示以下 api 响应:
GET http://localhost:5234/test
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Date: Wed, 08 Jan 2025 17:34:24 GMT
Server: Kestrel
Transfer-Encoding: chunked
"hello..."
Response code: 200 (OK); Time: 3ms (3 ms); Content length: 10 bytes (10 B)