Azure HTTPS重定向扩展下,IIS重定向致HttpContext.Request.ContentType为空求解决
解决Azure HTTPS重定向站点扩展导致ContentType为空的问题
我完全懂你的处境——用Azure自带的HTTPS重定向站点扩展(靠applicationhost.xdt配置实现)做HTTP到HTTPS的跳转,结果用Postman发请求触发重定向后,HttpContext.Request.ContentType居然是空的,而且你更想保留IIS层面的重定向逻辑,不想换成.NET Core常用的中间件方案。
问题根源
默认的IIS重定向(尤其是站点扩展自带的规则)在处理带请求体的请求时,往往不会完整保留原始请求的ContentType头部。这是因为重定向过程中,IIS默认可能没有显式传递这类请求头,导致后端的.NET Core应用接收到的请求丢失了这个关键信息。
解决方案:修改applicationhost.xdt配置
答案是肯定的,你可以通过调整applicationhost.xdt的规则,强制IIS在重定向时保留ContentType头部。下面是具体的配置示例:
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform"> <system.webServer> <rewrite> <!-- 替换现有HTTPS重定向规则,添加头部保留配置 --> <rules> <rule name="HTTPS Redirect" stopProcessing="true" xdt:Transform="Replace" xdt:Locator="Match(name)"> <match url="(.*)" /> <conditions> <add input="{HTTPS}" pattern="off" ignoreCase="true" /> </conditions> <action type="Redirect" url="https://{HTTP_HOST}/{R:1}" redirectType="Permanent" /> <!-- 显式保留Content-Type服务器变量 --> <serverVariables> <set name="HTTP_CONTENT_TYPE" value="{HTTP_CONTENT_TYPE}" xdt:Transform="InsertIfMissing" /> </serverVariables> </rule> </rules> <!-- 添加出站规则,确保重定向响应时保留头部 --> <outboundRules xdt:Transform="InsertIfMissing"> <rule name="Preserve Content-Type Header" preCondition="IsRedirect"> <match serverVariable="RESPONSE_LOCATION" pattern=".*" /> <action type="Rewrite" value="{R:0}" /> <serverVariables> <set name="HTTP_CONTENT_TYPE" value="{HTTP_CONTENT_TYPE}" /> </serverVariables> </rule> <preConditions> <preCondition name="IsRedirect" xdt:Transform="InsertIfMissing"> <add input="{RESPONSE_STATUS}" pattern="3.*" /> </preCondition> </preConditions> </outboundRules> </rewrite> </system.webServer> </configuration>
配置说明
- 这个XDT变换会替换你现有的HTTPS重定向规则,新增
serverVariables节点来强制保留HTTP_CONTENT_TYPE变量,确保重定向过程中该头部被传递到后端应用。 - 出站规则部分则针对所有3xx重定向响应,进一步加固头部的保留逻辑,避免在响应阶段丢失信息。
验证步骤
- 把修改后的
applicationhost.xdt上传到Azure站点的site根目录(可以通过Azure门户的「高级工具」→ Kudu → 站点文件管理器操作)。 - 重启你的Azure站点,让XDT配置生效。
- 再次用Postman发送带ContentType的HTTP请求,触发重定向后检查
HttpContext.Request.ContentType是否能正常获取到值。
额外注意点
- 如果你的请求是POST类型,默认301/302重定向会把请求方法转为GET。如果需要保留POST方法,你可以把重定向规则的
action部分改成:
307状态码会要求客户端重复原始的POST请求,不过需要确保Postman支持这种重定向行为。<action type="Redirect" url="https://{HTTP_HOST}/{R:1}" redirectType="Temporary" statusCode="307" /> - 确认你的Azure站点允许修改服务器变量,部分场景下需要在IIS相关配置中开启权限(可以通过Azure门户的「配置」→「常规设置」检查)。
内容的提问来源于stack exchange,提问作者ttugates
相关产品推荐
相关产品推荐

