【问题标题】:Host web api in blazor server application在 Blazor 服务器应用程序中托管 Web api
【发布时间】:2022-01-04 18:28:34
【问题描述】:

我已将 webapi 项目添加到我的解决方案中,并使用控制器执行 HttpGet。 Blazor 服务器项目可以在本地正常访问并进行部署。我可以在本地对服务进行邮递员调用,但是部署的版本从我的 _Host 文件中向我提供了 Blazor 连接失败消息。如何在不受 Blazor 干扰的情况下从外部配置 webapi 访问?

我认为这可能是某种我需要解决的路由问题。我正在使用 .NET5,我的 webapi 启动有这个:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
        app.UseSwagger();
        app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "myapp.WebApi v1"));
    }
    app.UseHttpsRedirection();
    app.UseRouting();
    app.UseAuthorization();
    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllers();
    });
}

WebApi Program.cs:

namespace myapp.WebApi
{
    public class Program
    {
        public static void Main(string[] args)
        {
            CreateHostBuilder(args).Build().Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                });
    }
}

Blazor Program.cs:

namespace myapp.UI
{
    public class Program
    {
        public static void Main(string[] args)
        {
            CreateHostBuilder(args).Build().Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                });
    }
}

我的 blazor 项目启动:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    app.UsePathBase("/myapp");

    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
        app.UseBrowserLink();
        //TelemetryDebugWriter.IsTracingDisabled = true;
    }
    else
    {
        app.UseExceptionHandler("/Error");
        // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
        app.UseHsts();
    }

    // SD2: app.UseSession();

    app.UseHttpsRedirection();
    app.UseStaticFiles();

    app.UseRouting();
    app.UseAuthentication();
    app.UseAuthorization();

    // SD2: app.UseMvc();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapBlazorHub();

        // prior fallback setting
        // endpoints.MapFallbackToPage("/_Host");
        
        // 1/4/22 https://stackoverflow.com/questions/61268117/how-to-map-fallback-in-asp-net-core-web-api-so-that-blazor-wasm-app-only-interc
        endpoints.MapFallbackToPage("{*path:regex(^(?!api).*$)}", "/_Host"); // don't match paths beginning with api
    });

}

我正在研究将 .../api/... 调用路由到 webapi 项目并将其他所有调用路由到 blazor 项目的方法。

在 VS 中,我的调用是 https://localhost:44368/api/controller/GetFoos/Year=2020

我部署的调用(尝试了几种变体) https://serverName/appName/api/controller/GetFoos/Year=2020

在 Blazor 中失败。我希望 Blazor 忽略并让 WebApi 处理它。

【问题讨论】:

    标签: blazor asp.net-core-webapi blazor-server-side


    【解决方案1】:

    这只是一些代码,展示了如何在同一站点上运行 API 控制器和 Blazor。

    您通常将控制器添加到 Blazor 服务器项目,如下所示:

    添加服务

    services.AddControllers();
    

    或者如果控制器在另一个项目/程序集中

    services.AddControllers().PartManager.ApplicationParts.Add(new AssemblyPart(typeof(Blazr.Database.Controllers.WeatherForecastController).Assembly));
    

    然后像这样设置中间件管道:

       app.UseEndpoints(endpoints =>
       {
          endpoints.MapControllers();
          endpoints.MapBlazorHub();
          endpoints.MapRazorPages();
          endpoints.MapFallbackToPage("/_Host");
       });
    

    _Host.cshtml 是 Blazor Server SPA 启动文件。

    endpoints.MapControllers(); 拦截并满足控制器的所有请求。 Blazor 应用启动页面是最终的后备。

    【讨论】:

    • 嘿,我决定放弃单独的项目,只将 api 控制器添加到我现有的 Blazor 应用程序中。现在我有一个安全问题,我在这里添加了一个单独的问题:stackoverflow.com/questions/70669528/…
    【解决方案2】:

    您也可以试试这个(从简短的测试来看,它似乎有效)。尝试在app.Map 内映射回退。

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapGrpcService<LocationsServiceV1>().EnableGrpcWeb();
    
        endpoints.MapControllers();
        endpoints.MapRazorPages();
    });
    
    app.Map("",
        builder =>
        {
            builder.UseRouting();
            builder.UseEndpoints(endpoints =>
            {
                // Fallback for blazor front-end
                endpoints.MapFallbackToAreaPage("{*path:nonfile}", "/_Host", "Frontend");
            });
        });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-16
      • 2021-08-15
      • 1970-01-01
      相关资源
      最近更新 更多