【问题标题】:How to get WebResource.axd querystring in correct case?如何在正确的情况下获取 WebResource.axd 查询字符串?
【发布时间】:2009-06-19 17:22:30
【问题描述】:

我正在从QueryString["path"] 获取用于缩小和压缩的 css 文件,一切都适用于我自己的 css 文件,如 main.css。但是当我尝试访问网络资源文件时,我收到 500 错误。 webresource.axd 后面的参数区分大小写,我从QueryString["path"] 小写接收它。

这是我从QueryString["path"] 得到的:

http://localhost/test/webresource.axd?d=-phgrn6r6zgehvbi697-bxvkl_gidnplxpdeukz5kncgr9hvnfvttpgykwyw05cda-nymtz9od_bbww3ynzxha2&t=633789305460522066

以上链接产生错误:CryptographicException: Padding is invalid and cannot be removed.

这是正确链接的样子:

http://localhost/test/WebResource.axd?d=-pHGRn6r6ZGehvBI697-BxVKl_GIdNPlxPdEUKZ5KNcGR9hvnfVtTpgyKwYw05cDa-NymTz9OD_bBwW3ynZXhA2&t=633789305460522066

唯一的区别在于大小写。 CryptographicException 似乎很常见,但即使设置 machineKey 也不能解决问题。关于如何在原始案例中获得 webresource.axd 的任何提示?

编辑

请求代码:

public void ProcessRequest(HttpContext context) {
    Control c = new Control();
    string root = context.Request.Url.GetLeftPart(UriPartial.Authority);
    string path = context.Request.QueryString["path"];
    string content = string.Empty;

    if (!string.IsNullOrEmpty(path)) {
        if (context.Cache[path] == null) {
            List<string> dependencies = new List<string>();
            string[] styles = path.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries);
            foreach (string style in styles) {
                content += RetrieveStyle(root + c.ResolveUrl(style)) + Environment.NewLine;
                dependencies.Add(context.Server.MapPath(style));
            }
            content = StripWhitespace(content);
            context.Cache.Insert(path, content, new CacheDependency(dependencies.ToArray()), Cache.NoAbsoluteExpiration, new TimeSpan(DAYS_IN_CACHE, 0, 0, 0));
        }
    }
}

当我调用时它在 RetreiveStyle 中崩溃:

using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())

【问题讨论】:

  • 你能提供你用来获取网络资源的代码吗?

标签: asp.net query-string webresource.axd


【解决方案1】:

罪魁祸首看起来像是生成“路径”查询字符串 csv 的代码或该源和处理程序之间的某些硬件或过滤器。

如果处理程序请求的来源是浏览器,则处理程序 url 通过查看源或 firebug 看起来像什么?已经小写了吗?

接下来,您的 IIS 管道中是否注册了任何模块等?

【讨论】:

    【解决方案2】:

    我没有答案,但我们遇到了类似的问题,我有一些事情要补充,这可能有助于确定问题。 所以,就这样吧:

    我们有一个 iHTTPHandler(我们称之为 Login.ashx),它接受一个 GET 请求,其中包含一个 base64 格式的令牌。 然后使用 Rijndael 算法对令牌进行解密。

    这个过程大部分时间都在工作,但是在上个月我们有几个请求由于 System.Security.Cryptography.CryptographicException: Padding is invalid and cannot be removed. 错误而失败.在我们的案例中,当令牌(base64 字符串)为小写且无法解密时,会引发此错误。

    查看日志和活动记录后,我可以看到特定用户会尝试通过 Login.ashx 来到我们这边,并且由于相关错误,请求将失败。请求的整个查询字符串(不仅仅是令牌)包括名称和值都是小写的。然后同一用户会在几分钟后尝试登录并能够登录,因为查询字符串没有转换为小写。

    所以,我感觉问题可能与浏览器有关。我不确定代理是否会影响这一点。

    其他信息: 服务器变量中没有捕获浏览器信息。 ALL_HTTP 和 ALL_RAW 变量几乎没有数据:

    • ALL_HTTP HTTP_CACHE_CONTROL:无缓存 HTTP_HOST:我们的服务器名称
    • ALL_RAW Cache-Control: no-cache Host: 我们的服务器名称

    也没有 HTTP_REFFERER。

    我试图用不同的浏览器(Safari3、Chrome1、Opera9.2、IE6、7、8、Firefox3)复制这个问题,但没有成功。

    我们有一个网络场,有 10 台服务器配置相同(至少我希望是这样)

    如果我有任何进展,我会添加更多信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-02
      • 1970-01-01
      • 2019-01-15
      • 2013-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多