服务器端 blazor 应用程序 httpclient 调用未到达我的网络 API 控制器 class

Server side blazor app httpclient calls are not reaching my web API controller class

我正在尝试使用 .Net Core 3.0 预览版中的 Blazor 服务器端应用程序 (RazorComponents) 创建多人游戏。我的服务器项目中有一个 SQL 精简版数据库和数据访问层来存储游戏信息。我有一个控制器 class,也在服务器项目中,使用数据访问层从数据库中获取 return 对象。我在 App 项目中的 cshtml 页面正在进行 api 调用(使用注入的 HttpClient)试图路由到我的控制器,但它没有到达服务器。

我一直在尝试不同的 Http 客户端调用,但 none 似乎正在到达控制器。我觉得我遗漏了一些明显的东西,或者配置不正确。我没有扎实的 Razor/MVC 背景,所以我很难解决这个问题。为了进行测试,我尝试调用一个 return 字符串

的简单方法

在 App.Game.cshtml @functions { } 部分:

private async Task SaveGame()
{
    var result = await Client.GetStringAsync("/api/Game/Test");
}

在Server.Controllers.GameController中:

public class GameController : Controller
{
    [HttpGet]
    [Route("api/Game/Test")]
    public string Test()
    {
        return "test";
    }
}

我的 Server.Startup 文件像这样注册 MVC 和 Http 服务:

// This method gets called by the runtime. Use this method to add services to the container.
    // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddRazorComponents<App.Startup>();
        services.AddMvc();

        //Code I got from internet to register httpclient service
        if (!services.Any(x => x.ServiceType == typeof(HttpClient)))
        {
            // Setup HttpClient for server side in a client side compatible fashion
            services.AddScoped<HttpClient>(s =>
            {
                // Creating the URI helper needs to wait until the JS Runtime is initialized, so defer it.
                var uriHelper = s.GetRequiredService<IUriHelper>();
                return new HttpClient
                {
                    BaseAddress = new Uri(uriHelper.GetBaseUri())
                };
            });
        }
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }

        app.UseStaticFiles();
        app.UseRazorComponents<App.Startup>();
        app.UseMvc(routes => { routes.MapRoute(name: "default", template: "{controller}/{action}/{id?}"); });
    }

调用 SaveGame() 方法并执行客户端调用时,我在输出中看到:

Microsoft.AspNetCore.Hosting.Internal.GenericWebHostService:信息:请求开始 HTTP/1.1 GET http://localhost:59682/api/Game/Test
Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware:信息:正在发送文件。请求路径:'/index.html'。物理路径:'{我的游戏路径}.Server\wwwroot\index.html'

看来它没有正确路由到控制器。我一直在谷歌上搜索其他人是如何做到这一点的,看来我的做法是正确的。有人知道我错过了什么吗?

我一直在学习以下教程: http://learn-blazor.com/architecture/rest-api/ https://medium.freecodecamp.org/how-to-create-an-application-using-blazor-and-entity-framework-core-1c1679d87c7e

试试这个:把 app.UseMvc(routes => { routes.MapRoute(name: "default", template: "{controller}/{action}/{id?}"); }); 在致电 app.UseStaticFiles(); and app.UseRazorComponents<App.Startup>();

之前

在我看来,服务器正在发送 index.html 而不是 (StaticFileMiddleware)

以防万一有人遇到同样的问题,在我的情况下这也有效:

app.UseEndpoints(endpoints =>
{
    endpoints.MapDefaultControllerRoute(); // <- this
    endpoints.MapBlazorHub();
    endpoints.MapFallbackToPage("/index_sse");
});