http-status-code-404 - 如何用实际的 404 状态代码响应替换 Blazor 默认值 "soft 404"

标签 http-status-code-404 blazor

404 的默认 Blazor 方法是在 App.razor 中创建一个软 404,但我想坚持搜索引擎最佳实践,在 Azure 上显示 404 页面时实际返回 404 状态代码。

我试图删除 App.razor 中的元素以查看是否可以强制执行 404,但是,该元素无法编译。

有什么建议?

最佳答案

在 Blazor WebAssembly 应用程序(ASP.Net Core 托管)模板中使用服务器端预渲染时,我能够返回 404 http 状态代码

当我将浏览器指向 http://localhost/fetchdata 时它返回了一个页面。我希望它返回 404 状态代码作为示例。这可以使用依赖注入(inject)和 stub 类来实现。

BlazorApp1.Client 我添加了一个 IResponse.cs 文件:

namespace BlazorApp1.Client {
    public interface IResponse {
        void SetNotFound();
    }
}

在 BlazorApp1.Client 我添加了一个 ResponseStub.cs 文件:
namespace BlazorApp1.Client {
    public class ResponseStub : IResponse {
        public void SetNotFound() {
            // Do nothing if we are browser side
        }
    }
}

在 BlazorApp1.Client 中的 FetchData.razor 中,我添加了:
@inject BlazorApp1.Client.IResponse Response

并在代码部分:
protected override void OnInitialized() {
    Response.SetNotFound();
}

在 BlazorApp1.Client 的 Program.cs 中,我添加了:
builder.Services.AddScoped<IResponse, ResponseStub>();

然后在 BlazorApp1.Server ,在 Startup.cs 中,我在 ConfigureServices 下添加:
services.AddHttpContextAccessor();
services.AddScoped<IResponse, Response>();

在配置下我替换了:
endpoints.MapFallbackToFile("index.html");

和:
endpoints.MapFallbackToPage("/_Host");

然后在 Response.cs 中创建 IResponse 的 Server 实现:
using BlazorApp1.Client;
using Microsoft.AspNetCore.Http;
using System.Net;

namespace BlazorApp1.Server {
    public class Response : IResponse {
        private readonly IHttpContextAccessor _httpContextAccessor;

        public Response(IHttpContextAccessor accessor) {
            _httpContextAccessor = accessor;
        }

        public void SetNotFound() {
            _httpContextAccessor.HttpContext.Response.StatusCode = (int)HttpStatusCode.NotFound;
        }
    }
}

最后我在 BlazorApp1.Server/Pages 中创建了一个 _Host.cshtml 文件:
@page "/fallback"
@namespace BlazorPrerendering.Server.Pages
@using BlazorApp1.Client
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@{
    Layout = "_Layout";
}
<app>
    <component type="typeof(App)" render-mode="ServerPrerendered" />
</app>
<div id="blazor-error-ui">
    An unhandled error has occurred.
    <a href="" class="reload">Reload</a>
    <a class="dismiss">🗙</a>
</div>
<script src="_framework/blazor.webassembly.js"></script>

警告
https://docs.microsoft.com/en-us/aspnet/core/fundamentals/http-context?view=aspnetcore-3.1是否声明:

Additionally, again for security reasons, you must not use IHttpContextAccessor within Blazor apps. Blazor apps run outside of the context of the ASP.NET Core pipeline and the HttpContext isn't guaranteed to be available within the IHttpContextAccessor, nor it is guaranteed to be holding the context that started the Blazor app.



这就是为什么我限制了这个服务器端预渲染的 Blazor 和 OnInitialized(也应该在 OnInitializedAsync 上工作)。

关于http-status-code-404 - 如何用实际的 404 状态代码响应替换 Blazor 默认值 "soft 404",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60239939/

相关文章:

Nginx - 将所有 404 错误传递回 PHP-FPM 以进行自定义错误页面处理

codeigniter - 为什么除了默认 Controller 会出现 404 Page Not Found 错误

ASP.NET/IIS : 404 for all file types

Blazor wasm - 调试 - 无法查看任何变量的值

blazor pwa 无法安装

Azure AD B2C : The redirect URI in the request, 与 OAuth 客户端授权的不匹配

Magento 主页不断重定向到 404 页面

python - Pylons - 将常规 404 Not Found 页面更改为自定义页面

c# - 使用 DI 时无法解析服务

json - 使用 Http.GetJsonAsync 发送参数