gpt4 book ai didi

asp.net-core - 如何在 ASP .NET Core Web API 中映射回退,以便 Blazor WASM 应用程序仅拦截不发送到 API 的请求

转载 作者:行者123 更新时间:2023-12-03 16:53:13 26 4
gpt4 key购买 nike

我有一个 Blazor WebAssembly 解决方案,其中包含一个基于 Microsoft 的默认解决方案模板的客户端项目、服务器项目和共享项目。我正在使用 Google Chrome 在 Visual Studio 2019 预览版中进行编辑和调试。

该解决方案开箱即用,只有一个启动项目,即服务器应用程序。该服务器应用程序具有对客户端应用程序的项目引用。您可以通过在服务器项目属性中选中“启用 SSL”来将其设置为使用 HTTPS,我已经这样做了。

当您单击调试时,它可以完美运行。

现在我想更改它,以便 Blazor WASM 应用程序仅响应来自 https://localhost:44331 的请求而不是对 https://localhost:44331/api 的请求.这些请求应该由服务器应用程序的 API Controller 端点处理。所以,如果有人访问 https://localhost:44331/api/something ,并且不存在这样的 API 端点,它们应该从 API 收到 404 错误代码,并且不会被路由到通常的 Blazor 页面,并说“抱歉,此地址没有任何内容”。

我想使用 URL 的这个额外的“/api”部分来保持对 API 的请求与对页面的请求分开。我认为这将更接近生产中的正常设置。我希望很清楚我要做什么。

这是一个带有路由属性的示例 Controller 声明:

namespace BlazorApp2.Server.Controllers
{
[ApiController]
[Route("api/[controller]")]
public class WeatherForecastController : ControllerBase
{
// Etc.

[HttpGet]
public IEnumerable<WeatherForecast> Get()
{
//etc.
}
///etc.
}
}

这是我在 Startup.cs 中尝试过的,但它不起作用。任何人都可以提出一些取悦的建议吗?
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
// Etc.
app.UseStatusCodePages();

app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
endpoints.MapControllers();
// The line commented out below is the out-of-the-box behaviour for a Blazor WASM app with ASP NET Core API. This is the line I want to replace.
// endpoints.MapFallbackToFile("index.html");

// The line below is my (failed) attempt to get the behaviour I want.
endpoints.MapFallback(HandleFallback);
});
}

private async Task HandleFallback(HttpContext context)
{
var apiPathSegment = new PathString("/api"); // Find out from the request URL if this is a request to the API or just a web page on the Blazor WASM app.

bool isApiRequest = context.Request.Path.StartsWithSegments(apiPathSegment);

if (!isApiRequest)
{
context.Response.Redirect("index.html"); // This is a request for a web page so just do the normal out-of-the-box behaviour.
}
else
{
context.Response.StatusCode = StatusCodes.Status404NotFound; // This request had nothing to do with the Blazor app. This is just an API call that went wrong.
}
}

有人知道如何按照我的意愿工作吗?

最佳答案

回顾一下这个问题,当有人提出请求时:

https://yourapp.com/api/someendpoint
/api/someendpoint找不到,他们被带到一个 Blazor 页面。这种默认行为很奇怪。对于以 /api 开头的请求,他们期待一个 HTTP 状态代码,也可能是一个 JSON 对象,但相反,他们得到了 HTML。也许他们甚至不使用您的应用程序。也许他们甚至不是人(更有可能他们是一个软件)。
这就是您向他们发送 HTTP 状态代码的方式。
在您的 Controller 上:
[Route("api/[controller]")]
public class SampleController : ControllerBase
{
// ...
}
在 Startup.cs 中:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
// ...
app.UseStaticFiles();
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
endpoints.MapControllers();
endpoints.Map("api/{**slug}", HandleApiFallback);
endpoints.MapFallbackToFile("{**slug}", "index.html");
});
}

private Task HandleApiFallback(HttpContext context)
{
context.Response.StatusCode = StatusCodes.Status404NotFound;
return Task.CompletedTask;
}

关于asp.net-core - 如何在 ASP .NET Core Web API 中映射回退,以便 Blazor WASM 应用程序仅拦截不发送到 API 的请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61268117/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com