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

标签 c# iis ssas httpmodule httprequest

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

到目前为止,我的方法是向 HttpRequest 添加一个过滤器,并在过滤器的 Read 方法中执行更改。不过,据我所知,Read 从未被执行。

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

我尝试使用 HttpModule 做的事情真的可行吗?我的 Filter 方法是否正确?

如果是这样,什么会导致Read不被命中?

这是我的代码的简化版本:


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
    }
}

最佳答案

实际上,可以通过 IIS 7.0+ 中的 HttpModule 修改 IIS 中 HttpRequest POST 的内容。我遇到了这个问题并且能够解决它。我发帖以供将来引用,因为没有很多帖子详细说明它何时/为什么会或不会起作用。

这是一个故障排除 list :

  1. 确保您的模块和任何其他模块没有以某种方式访问​​ Request 对象,从而使其在将您的过滤器添加到请求过滤器之前评估输入流。例如,访问 Request.Form["param"] 将触发对输入流的评估。一个症状是您的过滤器 Read 方法从未被调用。

  2. 查看统一 IIS 管道中的事件顺序 https://msdn.microsoft.com/en-us/library/bb470252.aspx .您将看到 PreRequestHandlerExecute 事件的发生与第 12 个事件引发的一样。要获得设置请求过滤器并应用它的最佳机会,您应该在 BeginRequest 事件中这样做,这是请求验证和 url 映射之后的第一个事件(在 HttpModule 中公开,还有其他公开在 ISAPI 扩展或过滤器中)。 ISAPI 过滤器和扩展确实有一些事件可能发生在 HttpModule 事件之前,但自

  3. 考虑到 Request.Filter 是一个流链,它们会连续评估,将输出从一个流传递到下一个流的输入,它们也可能在您的模块接收输入之前修改请求。如果有一些奇怪的行为,请考虑删除一些其他过滤器以隔离问题或更改它们的加载顺序。

  4. 还请考虑分块调用 Stream 过滤器的 Read 和 Write 方法,因此它们可以使用不同的偏移量调用多次,因此请确保您的重写逻辑行为正确,尤其是当您替换内容导致不同的整体请求或响应大小见下文。

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

如果您将问题隔离并简化为最基本的情况,您最终将确定导致它无法正常工作的原因。这里的简单示例演示了 https://msdn.microsoft.com/en-us/library/system.web.httprequest.filter.aspx但是它没有演示在缓冲流上操作。

我整理了一个演示缓冲请求和响应重写 HttpModule 的示例以供引用。 https://github.com/snives/HttpModuleRewrite

关于c# - 是否可以在 IIS HttpModule 中修改 HttpRequest POST 的内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3058956/

相关文章:

sql - OLE DB 或 ODBC 错误 : Login failed for user 'NT AUTHORITY\NETWORK SERVICE

c# - 非常简单的网络服务 : take inputs, 电子邮件结果

c# - 如何将多个 Windows Service PowerShell 命令组合成一个语句?

c# - 我如何获得由 regsvr32 工具注册的所有非托管 dll 的列表?

iis - 是否可以使用 Microsoft.Web.Administration 在基于云的 Appharbor 或 Azure 上操作 IIS 7?

sql-server - 如何聚合 SQL Server 2005 中的数据

ssas - 我如何在 SSAS DAX 中拆分由 , 分隔的列

c# - WinForms, CheckedListbox 自动列宽

iis - 已在证书存储中安装 SSL 证书,但它不在 IIS 证书列表中

python - 使用 IIS HTTP PlatformHandler 前置并使用 Windows 身份验证时,如何在 Python 中获取经过身份验证的用户名?