如何使用托管的 IIS 模块正确设置 HTTP 标头

33
我用C#编写了自己的托管IIS HTTP模块。它的目的是在某些条件下(这些条件无法通过路由规则处理)简单设置X-Forwarded-For和X-Forwarded-Proto请求头。该模块必须部署到我们的负载均衡器上(即安装了ARR并配置了服务器群集的IIS)。由于某些原因,头被设置了,但未传输到负载均衡器后面的Web服务器。我知道这是因为我检查了失败请求跟踪输出日志。 Failed Request Tracing logs 以下是我们的负载均衡器上安装的所有IIS模块的截图:

Ordered module list

如您所见,我的托管模块名为“QA.XForwardedHeadersModule”,在应用请求路由(ARR)本机模块之前加载。但是,这些标头仍然没有传输。我甚至使用Wireshark跟踪了我的请求。根本没有任何X-Forwarded标头。
这是否意味着托管模块与本机模块不完全兼容,并且本机模块(例如ARR)无法看到使用托管模块(例如我的自定义编写的模块)设置的请求标头?是否有任何可能解决此问题的方法?

@zaitsman,是的,我知道。这只是重写模块配置设置标头的规则,它有效。但是它如何帮助我呢?问题不在于我的标头未设置。它们已成功设置(我可以从上面附加的服务器日志中看到),但它们没有随请求传输到底层Web服务器。 - Dobby007
@Dobby007 所以我想说的是:尝试将变量(而不是标头)设置为一些虚拟值,然后在模块代码内使用反射将这些值替换为您自己的值。由于您已经清楚地展示了您的代码按正确顺序运行,我怀疑当请求到来时,IIS会将它们加载到内存中,然后执行整个工作程序;并且由于您已经在模块中钩入了该管道,这使您可以访问修改您想要的内容。 - zaitsman
我会建议你检查一下你的机器配置,看看它是否清除了你的配置。不确定你使用的是哪个版本的IIS,但是https://learn.microsoft.com/en-us/iis/configuration/system.webserver/httpprotocol/customheaders/是一个链接,可以为你提供有关http响应头的一些方向。 - user4573148
1
正如这些帖子所指出的那样,https://blogs.msdn.microsoft.com/benjaminperkins/2015/05/04/passing-client-ip-to-a-server-in-the-web-farm-using-application-request-router/ ARR本身会控制头文件,例如X-Forwarded-For。因此,在您的情况下,ARR很可能会删除您设置的内容。您不应该试图劫持ARR(因为这可能会导致更多问题),因此请尝试上面提到的解决方法,并让ARR保持原样。 - Lex Li
@LexLi,是的,我知道如果我告诉ARR这样做,它可以自己设置X-Forwarded-For头文件,但我的模块还设置其他头文件,例如X-Forwarded-Proto和X-Orig-Forwarded-For,除了ARR本身设置的头文件外,我在后端服务器上根本看不到任何头文件。顺便说一下,我并不完全理解你的意思。您建议尝试提到的解决方法,但同时又建议不要管ARR。提到的解决方法的目的是通过服务器变量设置头文件。 - Dobby007
显示剩余11条评论
1个回答

1

这是一个旧的“未回答”的帖子,所以我想加上我的两分钱。添加请求标头可能不起作用,这取决于ARR模块/处理程序如何处理请求。正如Tarun提到的那样,它可能太晚了,但出于另一个原因。ARR模块可能正在获取接收到的原始数据,在这种情况下,它肯定会太晚。或者ARR处理程序可能正在查看包含在您的通知之前设置的原始标头的特定服务器变量(例如,如果您添加其他请求标头,则我不认为ALL_RAW会更新)。在ARR模块很可能抓取原始缓冲区的情况下,您需要超越它并更新原始数据,如果可能的话,这是一个全新的复杂级别。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接