3

我的问题如下:我有一段代码充当网关,将请求路由到一个后端服务器或另一个。这段代码实际上是在一个 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 中有一些已加密(和编码)的参数。不幸的是,对值的加密方式没有太多控制,并且一些加密的值包含连续的正斜杠。例如:网站/12345?params=o//go4lia0%3d

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

从逻辑上讲,IIS 没有找到相应的文档(这是预期的)并调用上面的处理程序。问题是在这个阶段,查询字符串已经被IIS解码,连续的2个斜杠变成了一个。这会导致解密查询字符串失败。

有什么方法可以告诉 IIS:请不要放双斜线?

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

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

谢谢

4

1 回答 1

2

你解决了这个问题吗?我不知道您是否可以告诉 IIS 不使用双斜杠,但您可以通过访问此服务器变量来解析原始未触及的 URL 以获取未修改的查询字符串值:

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

我试过了,虽然双斜杠在 HttpContext.Current.Request.RawUrl 中消失了,但它们仍然存在于 HttpContext.Current.Request.ServerVariables["UNENCODED_URL"] 中。

于 2012-08-31T14:31:51.300 回答