首页 新闻 会员 周边 捐助

Angular + ASP.NET Core 中404页面如何返回404状态码

0
悬赏园豆:100 [已解决问题] 解决于 2019-08-24 14:05

在一个 Angular + ASP.NET Core 应用中, Angular 路由找不到页面时会返回 404 页面,但返回状态码是 200 ,请问有什么办法可以返回 404 状态码?

dudu的主页 dudu | 高人七级 | 园豆:30585
提问于:2018-11-27 14:49
< >
分享
最佳答案
0

解决这个问题要从 SSR 的原理开始,

node(express 服务) > angular 路由 > angular 对应的模块 > 有可能请求后端服务获取数据 > 渲染页面 -> 生成响应返回

那么解决办法其实很简单,就是当 angular 路由解析到这是一个 404 页面时,在生成响应的那步设置 response status code 为 404 即可。

具体的代码等我整理好再贴上来。

收获园豆:60
蝌蝌 | 初学一级 |园豆:158 | 2019-08-23 09:07
蝌蝌 | 园豆:158 (初学一级) | 2019-08-24 07:08
其他回答(3)
0

可以加一个动态页面,找不到路由就去请求这个动态404页面,在这个动态页面里设置Response.Status怎么样

收获园豆:30
chester·chen | 园豆:507 (小虾三级) | 2018-11-27 15:30

angular 路由可以直接发 http 请求吗?

支持(0) 反对(0) dudu | 园豆:30585 (高人七级) | 2018-11-27 21:27

@dudu: 守卫路由里直接跳过去

支持(0) 反对(0) chester·chen | 园豆:507 (小虾三级) | 2018-11-27 21:41
0
var signingKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(_appConfiguration["Authentication:Secret"]));

            var tokenValidationParameters = new TokenValidationParameters
            {
                //                ValidIssuer = _appConfiguration["Tokens:Issuer"],
                //                ValidAudience = _appConfiguration["Tokens:Issuer"],
                //                IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_appConfiguration["Tokens:Key"])),
                ValidateIssuerSigningKey = true,
                ValidateAudience = false,
                ValidateIssuer = false,
                IssuerSigningKeys = new List<SecurityKey> { signingKey },
                ValidateLifetime = true,
            };
            services.AddAuthentication(options =>
            {
                options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
                options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
            }).AddJwtBearer(options =>
            {
                options.Authority = "";
                options.Audience = "";
                options.RequireHttpsMetadata = false;
                options.IncludeErrorDetails = true;
                options.TokenValidationParameters = tokenValidationParameters;
                options.Events = new JwtBearerEvents
                {
                    OnAuthenticationFailed = c =>
                    {
                        c.NoResult();

                        c.Response.StatusCode = 404;
                        c.Response.ContentType = "text/plain";

                        return c.Response.WriteAsync(c.Exception.ToString());
                    }
                };
            }).AddCookie(options =>
            {
                options.LoginPath = "/SignIn/SignInAsync/";
                options.Cookie.Domain = "";
                options.Cookie.HttpOnly = false;
            });

我们是在Startup中用拦截器中弄得这个,不知道适不适合你们
收获园豆:10
悟行 | 园豆:12559 (专家六级) | 2018-11-27 16:29
0

拦截了 {"StatusCode cannot be set because the response has already started."}

十色 | 园豆:212 (菜鸟二级) | 2020-01-15 16:37
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册