首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >blazor服务器应用程序中的主机web api

blazor服务器应用程序中的主机web api
EN

Stack Overflow用户
提问于 2022-01-04 18:28:34
回答 2查看 3.2K关注 0票数 2

我在我的解决方案中添加了一个webapi项目,其中有一个控制器来执行HttpGet。Blazor服务器项目可以在本地访问它并进行部署。我可以在本地对服务进行邮递员调用,但已部署的版本会从我的_Host文件中给出Blazor连接失败的消息。我应该如何配置外部的webapi访问,而不需要Blazor干扰?

我想这可能是一个我需要解决的路线问题。我使用的是.NET5,我的webapi初创公司有:

代码语言:javascript
运行
复制
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:

代码语言:javascript
运行
复制
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>();
                });
    }
}

Program.cs:

代码语言:javascript
运行
复制
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项目启动:

代码语言:javascript
运行
复制
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忽略并让WebApi来处理它。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-01-04 22:59:47

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

通常将控制器添加到Blazor Server项目中,如下所示:

添加服务

代码语言:javascript
运行
复制
services.AddControllers();

或如果控制器位于另一个项目/程序集中。

代码语言:javascript
运行
复制
services.AddControllers().PartManager.ApplicationParts.Add(new AssemblyPart(typeof(Blazr.Database.Controllers.WeatherForecastController).Assembly));

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

代码语言:javascript
运行
复制
   app.UseEndpoints(endpoints =>
   {
      endpoints.MapControllers();
      endpoints.MapBlazorHub();
      endpoints.MapRazorPages();
      endpoints.MapFallbackToPage("/_Host");
   });

_Host.cshtml是Blazor启动文件。

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

票数 3
EN

Stack Overflow用户

发布于 2022-02-21 10:32:38

您也可以尝试这种方法(通过简单的测试,它看起来很有效)。尝试映射app.Map内部的回退。

代码语言:javascript
运行
复制
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");
        });
    });
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70583469

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档