是否可以修改IISHttpModule中HttpRequestPOST的内容?我需要在IIS中修改一些HttpRequests(SSAS连接字符串)的内容。基本上,我需要向请求中包含的SOAP添加一个元素。到目前为止,我的方法是向HttpRequest添加一个过滤器,并在过滤器的Read方法中执行更改。据我所知,Read从未执行过。我对Request.Filter的理解是它在处理请求的时候是从IIS读取的,所以IIS应该能看到我修改的Request。我正在尝试使用HttpModule这实际上可能吗?我的Filter方法是否正确?如果是这样,什么会导致Read不被击中?这是我的代码的简化版本:publicclassCustomHttpModule:IHttpModule{privateHttpApplicationapp;publicstringModuleName{get{返回“CustomHttpModule”;}}publicvoidInit(HttpApplicationcontext){app=context;context.PreRequestHandlerExecute+=newEventHandler(context_PreRequestHandlerExecute);}voidcontext_PreRequestHandlerExecute(objectsender,EventArgse){varrequest=app.Context.Request;request.Filter=newCustomHttpFilter(request.Filter);CustomHttpFilter(StreamoutputFilter){outputStream=outputFilter;}publicoverrideintRead(byte[]buffer,intoffset,intcount){//读取并进行必要的更改}}我不相信可以使用http模块修改请求,但你可以修改响应.HttpRequest对象大部分是只读的,因此它通常在任何上下文中都是不可变的,而不仅仅是来自模块。如果你真的很绝望,你可以尝试使用反射来访问更多的http请求对象。但是,要访问、修改或调用非公共成员,您的进程将需要完全信任权限,这在Web环境中是非常危险的。其实IIS中HttpRequestPOST的内容可以通过IIS7.0+中的HttpModule进行修改。我遇到了这个问题并且能够解决它。我发帖以供将来参考,因为没有很多帖子详细说明何时/为什么会或不会工作。这是一个故障排除清单:在将过滤器添加到请求过滤器之前,确保您的模块和任何其他模块无权访问Request对象来评估输入流。例如,访问Request.Form["param"]将触发对输入流的评估。这种情况的一个症状是永远不会调用filterRead方法。查看统一IIS管道中的事件顺序https://msdn.microsoft.com/en-us/library/bb470252.aspx。您会看到PreRequestHandlerExecute事件的发生就像第12个事件一样。为了最好地设置请求过滤器并应用它们,您应该在BeginRequest事件中执行此操作,这是请求验证和url映射之后的第一个事件(在HttpModule中公开,否则在ISAPI扩展或过滤器中公开)。ISAPIfilter和extensions确实有一些事件可能发生在HttpModule事件之前,但是从那时起考虑Request.Filter是一个流链,它们被不断评估,将输出从一个传递到下一个输入,它们也可以在模块之前接收输入修改请求。如果有一些奇怪的行为,请考虑删除一些其他过滤器以隔离问题或更改它们的加载顺序。还要考虑Streamfilter的读取和写入方法是分块调用的,因此它们可以被调用多次,具有不同的偏移量,因此请确保您的重写逻辑有效,特别是如果您要查看下面的替换导致不同的整体请求或响应大小。如果您在“读”或“写”中执行搜索/替换,您需要考虑数据可能跨越多个读/写。在这种情况下,您可能需要考虑在MemoryStream中缓冲请求或响应流并对其进行操作。如果您隔离问题并将其简化为最基本的场景,您最终将确定是什么导致它无法正常工作。此处的简单示例演示了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参考源来实现派生的工作请求。困难部分从输入流中读取所有字节并解析数据。您应该了解HTTPMultipart-form数据规范。以上是C#学习教程:IISHttpModule中是否可以修改HttpRequestPOST的内容?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
