gpt4 book ai didi

c# - 当请求离开 asp :multiview or ajax 时,在 Response.End() 之后没有写入响应

转载 作者:行者123 更新时间:2023-11-30 18:17:38 34 4
gpt4 key购买 nike

我写了一个 HttpModule 来拦截、评估和授权请求,检查登录用户是否有适当的访问权限到被请求的 url,在一个用 ASP.NET 2.0(网页,而不是 Web 应用程序)编写的相当古老的遗留系统中,它的客户不想移植到更新的框架。限制已在登录时加载和缓存。

一切正常,除非某些页面包含 <asp:MultiView>组件或有启动 ajax 方法的按钮时。当其中一种情况发生,并且用户无权访问该 url 时,会弹出一个警告框,其中包含来自 ThreadAbortException 的“未知错误”消息。由 Response.End() 抛出方法。

问题是:为什么只有在这两种情况下,我的“未经授权”消息才会被异常中的“未知错误”覆盖?

有没有一种方法可以使用数据库和缓存来实现 Url 授权系统而不造成困惑 Web.config具有像那些旧的 ASP.NET 示例那样的角色?

// My module init method.
public void Init(HttpApplication context)
{
context.PreRequestHandlerExecute += new EventHandler(context_PreRequestHandlerExecute);

// PreRequestHandlerExecute is the first stage at ASP.NET Pipeline
// where we could get a fulfilled Session variable
}

private void context_PreRequestHandlerExecute(object sender, EventArgs e)
{
HttpApplication application = (HttpApplication)sender;
HttpContext context = application.Context;

// additional request filtering/validation/etc.

LoggedUser user = (LoggedUser)application.Session["user"];

string path = context.Request.Path;

// more checks and rules...

if (!checkUserAuthorization(path, user))
{
context.Response.Write("<script>alert('Unauthorized. Contact your manager.');</script>");
context.Response.Write("<script>window.history.back();</script>");
context.Response.StatusCode = 403;
context.Response.End();
}
}

编辑:我已经尝试过的(没有目标):

  • Response.OutputStream.Close();
  • Response.Flush();
  • HttpApplication.CompleteRequest();

最佳答案

这是设计使然。您必须忽略它并为该异常添加一个捕获。

try {
context.Response.End();
}
catch{}

关于c# - 当请求离开 asp :multiview or ajax 时,在 Response.End() 之后没有写入响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43150767/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com