我有一个 Blazor WebAssembly 解决方案,其中包含客户端项目、服务器项目和共享项目,基于 Microsoft 的默认解决方案模板。我正在使用 Google Chrome 在 Visual Studio 2019 预览版中进行编辑和调试。
该解决方案开箱即用,只有一个启动项目,即服务器应用程序。该服务器应用程序具有对客户端应用程序的项目引用。您可以通过在服务器项目属性中选中“启用 SSL”来将其设置为使用 HTTPS,我已经这样做了。
当您单击调试时,它可以完美运行。
现在我想更改它,以便 Blazor WASM 应用程序仅响应来自https://localhost:44331 的请求,而不响应对https://localhost:44331/api 的请求。这些请求应该由服务器应用程序的 API 控制器端点处理。因此,如果有人访问https://localhost:44331/api/something,并且不存在这样的 API 端点,他们应该从 API 收到 404 错误代码,并且不会被路由到通常的 Blazor 页面说“对不起,没有任何东西在这个地址。”
我想使用 URL 的这个额外的“/api”部分来保持对 API 的请求与对页面的请求分开。我认为这将更接近生产中的正常设置。我希望很清楚我要做什么。
这是一个带有路由属性的示例控制器声明:
namespace BlazorApp2.Server.Controllers
{
[ApiController]
[Route("api/[controller]")]
public class WeatherForecastController : ControllerBase
{
// Etc.
[HttpGet]
public IEnumerable<WeatherForecast> Get()
{
//etc.
}
///etc.
}
}
Run Code Online (Sandbox Code Playgroud)
这是我在 Startup.cs 中尝试过的,但它不起作用。任何人都可以提出一些取悦的建议吗?
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
// Etc. …Run Code Online (Sandbox Code Playgroud) iis-express asp.net-core blazor asp.net-core-staticfile blazor-client-side
我现在正在尝试 Blazor 客户端一段时间,我注意到大多数不同的教程都建议客户端 blazor 通过服务器端 web-api 获取数据。
我不知道为什么会这样。为什么 razor 不能调用服务器方法,而是开发人员必须向 API 公开相同的数据。为什么要做这个额外的步骤?
例如
@page "/"
@inject HttpClient Http
<button onclick=@(async () => await PrintWebApiResponse())>Print Web API Response</button>
@functions {
private async Task PrintWebApiResponse()
{
var response = await Http.GetStringAsync("/api/Customer");
Console.WriteLine(response);
}
}
Run Code Online (Sandbox Code Playgroud)
这可以改写为
@page "/"
@inject HttpClient Http
<button onclick=@(async () => await PrintWebApiResponse())>Print Web API Response</button>
@functions {
private async Task PrintWebApiResponse()
{
ServerServices.Service service = new ServerServices.Service();
var response = service.GetCustomer();
Console.WriteLine(response);
}
}
Run Code Online (Sandbox Code Playgroud)
我刚刚尝试过(代码是页面模型中部分类的一部分)并且它工作得非常好。我在这里遗漏了一点吗?为什么建议通过 API 公开此方法?