- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在处理的一个项目集成了一个 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/
谁能告诉我这个 HttpModule 的目的?它出现在我的 HttpModule Collection 列表中,但我不知道它的用途。 System.ServiceModel.Activation.Ht
有没有一种好方法可以排除某些页面使用 HTTP 模块? 我有一个使用自定义 HTTP 模块来验证 session 的应用程序。 HTTPModule 在 web config 中是这样设置的:
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: HTTPModule Event Execution Order? 我正在调查 Page 对象最初是在 Ht
我在服务器上安装了一个 HTTP 模块。奇怪的是它可以工作,但每隔一段时间它就不会被执行。我有日志记录,在它不起作用的时候,它没有到达记录的代码。我在 IIS 日志或事件查看器中也没有看到任何内容。
我正在尝试创建一个虚拟文件。例如,我有一个组件可以从具有给定 ID 的数据库中获取 CMS 页面。现在我有一个类似 /hello/world/ 的 url,我想将页面 /hello/world/ 解析
当调用 web 服务时,我需要在调用某些操作时更改响应文本。 因此我创建了 HttpModule 来捕获响应并更改它。 代码下方: public class BeginEnd : IHttpModul
我知道这个已经被问过了here但是答案(改为使用处理程序)并不能解决问题,因为我使用的是未实现 IHttpHandler 的第三方组件。 那么,再一次,有什么方法可以根据特定请求加载/卸载 HttpM
如何设置它们? 如果我在 HttpModule 中有以下代码。 public static event EventHandler OnPostProcessing; 并在使用 EventHandler
我已经实现了一个 HttpModule,它拦截每个请求的响应流,并在每个文本/html 类型的响应上运行六到十几个 Regex.Replace()。我担心我在这里遭受了多少性能损失。有什么好方法可以查
我有一个 HttpModule,我将几个不同的在线资源拼凑成一个(大部分)既适用于传统 ASP.NET 应用程序,也适用于 ASP.NET MVC 应用程序的东西。其中最大的一部分来自 CodePle
我试图找到一种以编程方式检查是否加载了特定 HttpModule 的方法(因为我正在编写的组件需要模块正常工作)。我正在努力: bool ismodulepresent = false; foreac
通过网络搜索,我收到很多关于 HTTPModule 路由默认是单线程还是多线程的相互冲突的帖子。 我正在尝试在本地、UAT 和部署环境中调试快速不同的性能,并且想知道 HTTPModule 是否存在我
我是否必须锁定对实例成员的访问? 示例: public class HttpModule : IHttpModule { //... Dictionary foo; void
我正在查看许多页面关于 asp.net 的性能建议。具体来说,删除未使用的 httpmodules 部分: 这里列出
从 Asp.Net 5 开始,我们现在有了“中间件”概念来更改请求和响应或与请求和响应交互。所有这些都是在使用 HttpModule 之前完成的。 这是我的问题。 到底什么是 ASP.NET 中间件?
有人知道某个站点或页面,或者知道 HTTPModule 事件执行的 HTTPApplication 类的事件的执行顺序吗? 我找到了MSDN Documentation对于所有事件,但它没有显示流程步
我正在编写一个应用程序,第三方供应商可以在其中编写插件 DLL 并将它们放入 Web 应用程序的 bin 目录中。我希望这些插件能够在必要时注册自己的 HttpModule。 无论如何,我是否可以在运
我们突然遇到 CPU 峰值。检查我们的 Sitecore 日志后,我注意到有很多日志条目带有“11:49:26 INFO HttpModule is beinginitialized”。据了解,这应该
我创建了一个简单的 HttpModule 来记录我现有网络服务的使用情况。有一个包含单个类的 dll public class TrackingModule : System.Web.IHttpMod
我正在尝试使用 HttpModule 来拦截对不包含任何代码文件(图像、音乐等)的特定目录的请求。我拥有的模块可以工作,除了它适用于所有文件夹而不仅仅是我想要它应用的文件夹。我试图在我的 web.co
我是一名优秀的程序员,十分优秀!