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
,这就是你遇到问题的原因。尝试添加以下代码,您将获得与本地相同的结果。
- 更改
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();
});
}
Gif
在为 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
,这就是你遇到问题的原因。尝试添加以下代码,您将获得与本地相同的结果。
- 更改
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();
});
}
Gif