Asp.NET 核心 Web-API 到 Azure 应用服务的部署问题

Asp.NET Core Web-API deployment issue to Azure AppService

在为 C# ASP.NET Core Web-API 项目发布到 Azure 应用程序服务后,我收到浏览器通用 404“找不到页面”错误。我的代码在 VS2019 和 IISExpress 上运行良好。我什至回到原点并使用默认项目模板 (Web-Api) 创建项目,但我仍然遇到相同的错误。我使用的是 VS 为我生成的未经修改的示例代码,没有数据库或外部依赖项!

Azure 应用服务创建正常,“嘿,应用服务开发人员!您的应用服务已启动,运行正在...”页面显示正常。

在 publish 操作之后,事情变得很糟糕,没有页面返回给浏览器,导致 404 错误。

几天来我一直在解决这个问题,很多天。

我发现,如果我“隐藏”web.config 文件(通过使用 Azure 应用服务编辑器重命名它),“嘿,应用服务开发人员...”页面再次出现好了。

那一定意味着发生了一些 运行 时间错误,是吗?

我最多只能通过日志记录来确定,错误似乎是“请求路径”和“不匹配任何端点”,如下所示,这对我没有帮助:(

2021-06-16 00:18:46.526 +00:00 [Debug] Microsoft.Extensions.Hosting.Internal.Host: Hosting started
2021-06-16 00:18:46.548 +00:00 [Information] Microsoft.AspNetCore.Hosting.Diagnostics: Request starting HTTP/1.1 GET https://webapplication720210614173743.azurewebsites.net/  
2021-06-16 00:18:46.557 +00:00 [Debug] Microsoft.AspNetCore.HostFiltering.HostFilteringMiddleware: Wildcard detected, all requests with hosts will be allowed.
2021-06-16 00:18:46.558 +00:00 [Trace] Microsoft.AspNetCore.HostFiltering.HostFilteringMiddleware: All hosts are allowed.
2021-06-16 00:18:46.609 +00:00 [Debug] Microsoft.AspNetCore.Routing.Matching.DfaMatcher: No candidates found for the request path '/'
2021-06-16 00:18:46.615 +00:00 [Debug] Microsoft.AspNetCore.Routing.EndpointRoutingMiddleware: Request did not match any endpoints
2021-06-16 00:18:46.637 +00:00 [Information] Microsoft.AspNetCore.Hosting.Diagnostics: Request finished in 88.5694ms 404

另一件奇怪的事情是,如果我使用“ASP.Net Core Web App”模板,这不会发生。

我不确定发布代码是否有帮助,因为它是从模板生成的代码,并且在本地工作正常。

如果有人能提供一些见解,我将不胜感激。

干杯, 马克.

创建一个api项目,因为默认没有默认页面,所以出现了你遇到的现象

访问你的api应该可以正常访问你的项目

解决方案

默认,我们可以在本地测试我们的api,所以在IsDevelopment中它会生成swagger.json,这就是你遇到问题的原因。尝试添加以下代码,您将获得与本地相同的结果。

  1. 更改 startup.cs 文件。
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
        app.UseSwagger();
        app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "EF_API v1"));
    }
    // default, no below code
    else {
        app.UseSwagger();
        app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "EF_API v1"));
    }
    // add below code, when start with https://..../swagger
    var option = new RewriteOptions();
    option.AddRedirect("^$", "swagger");
    app.UseRewriter(option);

    app.UseHttpsRedirection();

    app.UseRouting();

    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllers();
    });
}
  1. Gif