如何用实际的404状态代码响应替换Blazor默认的“软404”

时间:2020-02-15 14:57:29

标签: http-status-code-404 blazor

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

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

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

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

当我将浏览器指向http://localhost/fetchdata时,它返回了一个页面。我希望这以返回404状态代码为例。使用依赖项注入和存根类可以实现这一点。

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>();

然后在我在ConfigureServices下添加的Startup.cs中的 BlazorApp1.Server 中:

services.AddHttpContextAccessor();
services.AddScoped<IResponse, Response>();

,然后在“配置”下我替换为:

endpoints.MapFallbackToFile("index.html");

具有:

endpoints.MapFallbackToPage("/_Host");

然后在Response.cs中创建IResponse的服务器实现:

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确实声明:

此外,出于安全考虑,您也不得使用 Blazor应用程序中的IHttpContextAccessor。 Blazor应用在外部运行 ASP.NET Core管道和HttpContext的上下文不是 保证在IHttpContextAccessor中可用,也不是 确保拥有启动Blazor应用程序的上下文。

这就是为什么我限制了服务器端预渲染的Blazor和OnInitialized的原因(应该也可以使用OnInitializedAsync)。

相关问题