gpt4 book ai didi

c# - 了解 HttpModule 和 URL 操作

转载 作者:太空狗 更新时间:2023-10-30 01:35:39 25 4
gpt4 key购买 nike

我正在处理的一个项目集成了一个 php 应用程序 (Revive AdServer FWIW)。我们控制它部署到的服务器,但我认为改变代码是不可能的。 Revive 具有调用 javascript 代码,您可以将其部署到您希望转换广告的网站,当代码在这些网站上呈现时,它会调用 php 应用程序并根据传入的查询字符串智能地显示广告。

我们需要做的是在从这些站点之一发出调用之后,在调用 php 应用程序并操作查询字符串之前拦截调用。为此,我编写了一个 HttpModule,我们已将其添加到 php 应用程序的 IIS 中。这是代码:

public class AdServerModule : IHttpModule
{
public void OnBeginRequest(object sender, EventArgs e)
{
var context = ((HttpApplication)sender).Context;
var queryString = context.Request.QueryString;
var readonlyProperty = queryString.GetType().GetProperty("IsReadOnly", BindingFlags.Instance | BindingFlags.NonPublic);
readonlyProperty.SetValue(queryString, false, null);
queryString.Add("foo", "bar");
readonlyProperty.SetValue(queryString, true, null);
}

public void Init(HttpApplication context)
{
context.BeginRequest += new EventHandler(OnBeginRequest);
}
}

在此示例中,您可以看到我正在使用反射将 &foo=bar 添加到 Request 的查询字符串中。我不确定我是否误解了应该发生的事情,但我希望在请求中的某处看到它,但我没有。

此外,我并没有尝试在 PHP 代码中摸索太多,但我相信它正在检查请求的 URL 以获取查询字符串值,因此看起来我需要更改 URL 而不仅仅是操纵上下文。 Request.Query 字符串属性(这似乎不是一个)。我想知道我是否需要实现 UrlRewriter(我不熟悉这样做)。在我看到的一个示例中,调用了 context.RewritePath(),但如果在 HttpModule 中使用,这似乎会导致无限循环/堆栈溢出。

在此先感谢您的帮助。

最佳答案

我想通了。事实证明您确实需要使用 RewritePath() 方法。我最初没有正确使用它。现在这是我的代码:

public class AdServerModule : IHttpModule
{
public void OnBeginRequest(object sender, EventArgs e)
{
var context = ((HttpApplication)sender).Context;
var queryString = context.Request.QueryString;
var readonlyProperty = queryString.GetType().GetProperty("IsReadOnly", BindingFlags.Instance | BindingFlags.NonPublic);
readonlyProperty.SetValue(queryString, false, null);
queryString.Add("foo", "bar");

var path = GetVirtualPath(context);
context.RewritePath(path, String.Empty, queryString.ToString());

readonlyProperty.SetValue(queryString, true, null);
}

public void Init(HttpApplication context)
{
context.BeginRequest += new EventHandler(OnBeginRequest);
}

private static string GetVirtualPath(HttpContext context)
{
string path = context.Request.RawUrl;
var queryStringLength = path.IndexOf("?");
path = path.Substring(0, queryStringLength >= 0 ? queryStringLength : path.Length);
path = path.Substring(path.LastIndexOf("/") + 1);
return path;
}
}

您可以看到我在哪里添加了 context.RewritePath() 调用。就像一个魅力!

关于c# - 了解 HttpModule 和 URL 操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25015150/

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