gpt4 book ai didi

c# - UrlRewriter+HttpModule+Session问题

转载 作者:行者123 更新时间:2023-11-30 14:20:58 25 4
gpt4 key购买 nike

我需要使用 HttpModule 编写自定义“UrlRewriter”,在“重写”的那一刻,我需要访问 Session 并遵循了另一个 SO 线程的建议:

Can I access session state from an HTTPModule?

一切正常,除了 RewritePath/Redirect 部分。我没有得到任何异常(exception),但浏览器需要永远加载。这真的是构建这样的 urlrewriter 的最佳方式吗?

using System;
using System.Web;
using System.Web.SessionState;
using System.Diagnostics;

namespace MyCompany.Campaigns
{

public class CampaignRewriteModule : IHttpModule
{
public void Init(HttpApplication application)
{
application.PostAcquireRequestState += new EventHandler(Application_PostAcquireRequestState);
application.PostMapRequestHandler += new EventHandler(Application_PostMapRequestHandler);
}

void Application_PostMapRequestHandler(object source, EventArgs e)
{
HttpApplication app = (HttpApplication)source;

if (app.Context.Handler is IReadOnlySessionState || app.Context.Handler is IRequiresSessionState)
{
return;
}

app.Context.Handler = new MyHttpHandler(app.Context.Handler);
}

void Application_PostAcquireRequestState(object source, EventArgs e)
{
HttpApplication app = (HttpApplication)source;

MyHttpHandler resourceHttpHandler = HttpContext.Current.Handler as MyHttpHandler;

if (resourceHttpHandler != null)
{
HttpContext.Current.Handler = resourceHttpHandler.OriginalHandler;
}

Debug.Assert(app.Session != null);


string path = HttpUtils.Path();

if (!CampaignCodeMethods.IsValidCampaignCode(path)) return;

string domain = HttpUtils.Domain();

CampaignCode code = CampaignManager.RegisterCode(path, domain.Equals(Config.Instance.Domain.ToLower()) ? null : domain);

if (code != null)
{
//app.Context.RewritePath(code.CampaignCodePath.Path, false);
app.Context.Response.Redirect(code.CampaignCodePath.Path, true);
}


}

public void Dispose() { }

public class MyHttpHandler : IHttpHandler, IRequiresSessionState
{
internal readonly IHttpHandler OriginalHandler;

public MyHttpHandler(IHttpHandler originalHandler)
{
OriginalHandler = originalHandler;
}

public void ProcessRequest(HttpContext context)
{
throw new InvalidOperationException("MyHttpHandler cannot process requests.");
}

public bool IsReusable
{
get { return false; }
}
}

}

}

最佳答案

我想我知道它是什么。您的模块在所有请求上执行,并分配一个抛出错误的处理程序,除非存在有效的事件代码(发生重写/重定向)。

但是因为这不仅仅是针对您的“处理程序事件代码”url,它会导致抛出错误,这会导致您被重定向到您的错误页面,该错误页面正在被模块捕获,该模块正在分配处理程序,正在抛出错误,正在重定向……我想你明白我要去的地方了;)

否则我会尝试一些事情:

  • 设置 Fiddler 并检查无限重定向循环
  • 在 app.Context.Response.Redirect 上放置一个断点 - 确保您不会陷入无限循环
  • 在 MyHttpHandler.ProcessRequest 上放置一个断点 - 确保它没有被调用并且异常被吞没

关于c# - UrlRewriter+HttpModule+Session问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/506431/

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