IIS在queryString中将双斜杠修改为单斜杠

时间:2012-06-21 01:45:21

标签: url iis-7 http-status-code-404 httphandler

我的问题如下: 我有一段充当网关的代码,将请求路由到一台后端服务器或另一台。此代码实际上是在IHttpHandler中实现的,它在404;

上触发

伪代码如下:

    public void ProcessRequest(HttpContext context)
    {
        try
        {
            var absoluteUri = context.Request.Url.AbsoluteUri;

            //... clean URL to get the part that we need 

            string RedirectTo = ...;

            context.Response.Redirect(RedirectTo, false);                
        }
        catch (Exception ex)
        {
            ...
        }
    }

我的问题是在到达此代码的queryString中有一些加密(和编码)的参数。 不幸的是,对值加密的方式没有多少控制,加密的某些值包含连续的正斜杠。 例如:website / 12345?params = o // go4lia0%3d

当IIS收到请求时,双斜杠最初被编码(%3d%3d)。

逻辑上,IIS找不到相应的文档(预期的)并调用上面的处理程序。问题是,在此阶段,查询字符串已由IIS解码,并且2个连续斜杠转换为单个斜杠。这会导致解密查询字符串失败。

有没有办法告诉IIS:请单独留下双斜线?

几点澄清: - 此功能是生成发送给最终用户的链接,以便自动填充屏幕上的某些字段。我知道在MVC控制器中处理它可能更容易......也许我最终会这样做而不是触发404.

  • 生成加密值的代码可以更改,以便它不会生成斜杠(这本来是个好主意,但已经发送了错误链接的电子邮件,所以它太晚了...

感谢

1 个答案:

答案 0 :(得分:2)

你解决了这个问题吗?我不知道你是否可以告诉IIS单独留下双斜线,但你可以通过访问这个服务器变量来解析原始的未经修改的URL以获得未修改的查询字符串值:

HttpContext.Current.Request.ServerVariables["UNENCODED_URL"]

我试了一下,虽然在HttpContext.Current.Request.RawUrl中双斜线消失,它们仍然存在于HttpContext.Current.Request.ServerVariables [“UNENCODED_URL”]中。