Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在不更改url的情况下获取要显示的自定义页面_C#_Url_Redirect_Asp.net Core Mvc - Fatal编程技术网

C# 在不更改url的情况下获取要显示的自定义页面

C# 在不更改url的情况下获取要显示的自定义页面,c#,url,redirect,asp.net-core-mvc,C#,Url,Redirect,Asp.net Core Mvc,我想在用户尝试访问他们不应该访问的内容时显示一个页面。此限制是签入自定义中间件。当中间件返回false并且调用新控制器时,我不希望客户端url发生更改 这是我的支票: public异步任务调用(HttpContext上下文,IAutorisationService) { var user=service.CreateUserModel(上下文); var page=service.CreatePageModel(上下文); context.Items.Add(“CurrentUser”,user

我想在用户尝试访问他们不应该访问的内容时显示一个页面。此限制是签入自定义中间件。当中间件返回false并且调用新控制器时,我不希望客户端url发生更改

这是我的支票:

public异步任务调用(HttpContext上下文,IAutorisationService)
{
var user=service.CreateUserModel(上下文);
var page=service.CreatePageModel(上下文);
context.Items.Add(“CurrentUser”,user);
if(service.UserAllowedToPage(用户,第页))
wait_next.Invoke(上下文);
其他的
{
Redirect(“/Error/CustomError”);
}
}
这是错误控制器:

public IActionResult CustomError()
{
if(!HttpContext.Items.TryGetValue(“CurrentUser”,out var o)| |!(o是UserModel UserModel))
{
返回视图();
}
if(userModel.issuerpuser)
{
返回视图();
}
这里返回的视图都很好

这是我的startup.cs(我现在在这里挣扎):

app.UseMvc(路由=>
{
//routes.MapRoute(
//名称:“错误路线”,
//模板:“{controller=Error}”,
//默认值:新建{controller=“Error”,action=“CustomError”});
routes.MapRoute(
名称:“默认”,
模板:“{controller=Home}/{action=Index}/{id?}”);
});
我在网上找到的任何一种组合似乎都不合适

更新

好吧,我不打算再谈这些政策了。 我会尽量更好地解释我的情况: 我在管道末端有一个自定义中间件(就在app.UseMvc之前) 该中间件有一个异步任务调用方法,该方法调用不同类中的布尔运算符。 现在,如果布尔值返回true,中间件任务将执行:
wait\u next.Invoke(HttpContext)
,如果布尔值返回false,我希望中间件执行异常。 当抛出异常时,我需要:
app.UseExceptionHandler(“/Error/CustomError”);
app.useStatusCodePageSwithExecute(“/Error/CustomError”);

捕获它并在ErrorController中激活CustomError操作,然后返回自定义视图。这可能吗?(如果我的第一个问题没有完成,很抱歉)

您好,您可以使用

return View("Error")

您可以随时检查所需内容,如果出现错误,而不是主视图,则可以返回错误视图。如果不更改URL,则无法重定向到页面。重定向实际上是在客户端进行的。服务器只需发送302响应,其中包含替代URL的
位置
头。这是客户端的re负责实际请求该备用URL,这是浏览器默认执行的操作。因此,浏览器将实际请求
/Error/CustomError

您需要做的是直接从中间件返回实际的错误响应,以便URL保持原样

相反,您应该使用内置授权框架。您可以通过实现需求和处理程序,然后使用
Authorize
属性引用策略,将自定义策略应用于控制器/操作:

[Authorize(Policy = "MyPolicy")]
public IActionResult MyProtectedAction()
然后,当用户未能满足策略要求时,他们将陷入异常处理中间件,在该中间件中,您可以通过配置
app来绑定自定义视图。UseStatusCodePagesWithReExecute

public class Startup
{
    ...

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        app.UseStatusCodePagesWithReExecute("/error/{0}");

        ...
    }
}
然后,它将执行为
/error/{0}
路由定义的控制器和操作,而不影响URL(“重新执行”部分)
位将替换为HTTP状态码,HTTP状态码将是
401 Unauthorized
。所以您可以将一个操作绑定到
/error/401
,或者使用类似
/error/{statusCode}的路由执行一个全面的操作
然后在状态代码内部分支以处理多种不同的错误类型。值得一提的是,这也是您提供自定义404页、500页等的方式

有关更多信息,请参阅:


这并不是我想要的答案。我知道我可以做到这一点,但我想在不更改url的情况下将用户重定向到自定义控制器+视图。我尝试了所有方法,但我发现UseStatusCodePagesWithReExecute不起作用,可能是因为它正在使用IIS Express运行?请确保您没有将其放在一个条件限制内t直接阻止它在开发中加载。除此之外,它几乎可以正常工作,因此不确定该告诉您什么。IIS Express不重要。状态代码页直接响应特定的状态代码,而不是异常。请尝试返回类似于
new StatusCodeResult(401)的内容
。它不起作用,即使抛出异常,developerCeptionPage也没有捕获它。感觉它与管道中的位置有关,或者由于某种原因,我的整个设置没有通过我告诉他们使用的控制器捕获状态码或异常。