是否可以在IIS HttpModule中修改HttpRequest POST的内容?

我需要修改IIS中某些HttpRequests(SSAS连接字符串)的内容。 基本上,我需要向包含在请求中的SOAP添加一个元素。

到目前为止,我的方法是将过滤器添加到HttpRequest中,并在过滤器的Read方法中执行更改。 据我所知,虽然,Read永远不会被执行。

我对Request.Filter的理解是它从IIS处理请求时读取,所以IIS应该看到我的修改的请求。

是我正在尝试使用HttpModule实际上可能做到的,并且我的过滤器方法正确吗?

如果是这样,什么会导致阅读不被击中?

以下是我的代码的简化版本:


public class CustomHttpModule : IHttpModule {
    private HttpApplication app;
    public string ModuleName {
        get { return "CustomHttpModule"; }
    }
    public void Init(HttpApplication context) {
        app = context;
        context.PreRequestHandlerExecute += new EventHandler(context_PreRequestHandlerExecute);
    }
    void context_PreRequestHandlerExecute(object sender, EventArgs e) {
        var request = app.Context.Request;
        request.Filter = new CustomHttpFilter(request.Filter);
    }
}

public class CustomHttpFilter : Stream {
    private Stream outputStream;
    public CustomHttpFilter(Stream outputFilter) {
        outputStream = outputFilter;
    }
    public override int Read(byte[] buffer, int offset, int count) {
        // read and make the necessary changes
    }
}

我不认为可以用http模块修改请求 ,但是可以修改响应HttpRequest对象大部分是只读的,所以它在任何上下文中都是不可变的,而不仅仅是来自模块。

如果你真的很绝望,你可以尝试使用反射来访问更多的http请求对象。 要访问,修改或调用非公共成员,您的流程将需要完全信任权限, 这在Web环境中非常危险


实际上,可以通过 IIS 7.0 +中的HttpModule修改IIS中HttpRequest POST的内容 。 我有这个问题,并能解决它。 我将发布供将来参考,因为没有多少帖子详细说明何时/为什么会或不会工作。

这是一个排除故障的清单:

  • 确保您的模块和其他任何模块都不以访问请求对象的方式来评估输入流PRIOR,以将您的过滤器添加到请求过滤器中。 访问Request.Form["param"]例如会触发对输入流的评估。 其中一个症状是您的过滤器Read方法从未被调用过。

  • 查看统一IIS管道中事件的顺序https://msdn.microsoft.com/en-us/library/bb470252.aspx。 您将看到PreRequestHandlerExecute事件与第12次事件一样发生。 为了有最好的机会设置请求过滤器并将其应用于BeginRequest事件中,这是请求验证和URL映射(在HttpModule中公开,其他人在ISAPI扩展或过滤器中公开)之后的第一个事件。 。 ISAPI过滤器和扩展确实有一些可能发生在HttpModule事件之前的事件,但是因为

  • 考虑一下,Request.Filter是一串Streams,他们会连续评估一个输出到下一个输入的输出,他们也可能在你的模块接收输入之前修改请求。 如果存在一些奇怪的行为,请考虑删除其他一些过滤器来隔离问题或更改它们加载的顺序。

  • 还要考虑Stream过滤器的Read和Write方法是以块的形式调用的,因此可以多次调用它们,并使用不同的偏移量,因此请确保重写逻辑的行为正确,特别是如果要替换导致请求或响应大小不同的内容见下文。

  • 如果您在读取或写入中执行搜索/替换,则需要考虑您的数据可能跨越多个读取/写入。 在这种情况下,您可能需要考虑缓冲MemoryStream中的Request或Response流,然后对其进行操作。

  • 如果您将问题分离并简化为最基本的情况,您最终将识别是什么导致其无法工作。 这里的简单示例演示https://msdn.microsoft.com/en-us/library/system.web.httprequest.filter.aspx,但它不演示在缓冲流上运行。

    我已经将示例演示了一个缓冲的请求和响应重写HttpModule以供参考。 https://github.com/snives/HttpModuleRewrite


    可以通过重写WorkerRequest来实现。 你可以像下面这样获得当前的工作者请求

    (HttpWorkerRequest)context.GetService(typeof(HttpWorkerRequest))
    

    您可以通过引用IIS7WorkerRequest.cs .net参考源来实现派生工作者请求。

    硬件部分从输入流中读取所有字节并解析数据。 你应该知道HTTP多部分形式的数据规范。

    链接地址: http://www.djcxy.com/p/1161.html

    上一篇: Is it possible to modify the content of HttpRequest POST in an IIS HttpModule?

    下一篇: git diff between remote and local repo