我正在与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
添加到请求的查询字符串中。我不确定我是否误解了应该发生的事情,但我希望在请求的某个地方看到这个,但我没有。
此外,我没有试图绊倒周围的php代码非常多,但我相信它检查查询字符串值的请求的URL,所以似乎我需要改变URL不只是操纵context.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()
调用。真是妙不可言!