【问题标题】:How to prevent error messages for WebResource.axd errors from appearing in the Application log?如何防止 WebResource.axd 错误的错误消息出现在应用程序日志中?
【发布时间】:2013-10-31 09:15:30
【问题描述】:

我在 IIS 7.5 下运行 ASP.NET Web 应用程序,我的应用程序日志充满了如下错误:

事件代码:3012

事件消息:处理 Web 或脚本资源时发生错误 要求。资源标识符解密失败。

...

异常信息:

Exception type: HttpException 

Exception message: Unable to validate data.

在 System.Web.Configuration.MachineKeySection.EncryptOrDecryptData(布尔 fEncrypt, Byte[] buf, Byte[] 修饰符, Int32 start, Int32 length, Boolean useValidationSymAlgo, Boolean useLegacyMode, IVType ivType, 布尔符号数据)

...

请求信息:

Request URL: http://www.mysite.com/WebResource.axd?d=l0ngstr1ng0fl3tt3rs4ndd1g1ts 

Request path: /WebResource.axd 

...

如何防止它们出现?根据this link,我已将以下代码添加到我的 Global.asax 文件中:

void Application_Error(object sender, EventArgs e)
{
  // Code that runs when an *unhandled* error occurs
  //// get reference to the source of the exception chain
  Exception ex = Server.GetLastError();
  string message = ex.Message;
  string path = Request.Path;
  // ignore the following:
  //   errors due to bots trying AXD URLs
  //   errors due to <doNastyThings /> tags in the URLs
  if (
    (ex is HttpException && (path.StartsWith("/WebResource.axd") || path.StartsWith("/ScriptResource.axd"))) ||
    (ex is HttpException && message.StartsWith("A potentially dangerous Request.Path value was detected from the client"))
    )
  {
    // clear the error *to prevent it from appearing in the main Application log*
    Server.ClearError();
    // need to manually direct to the error page, since it will no longer happen automatically once the error has been cleared
    Response.Redirect("/Error");
  }
}

第二组错误(对于潜在危险的请求)被这段代码捕获和抑制;但是,在执行此代码时,WebResource.axd 错误已写入应用程序日志。我推测这是因为 AXD 处理程序在错误日志记录方面与标准 ASPX 处理程序的工作方式不同(但我不知道该怎么做)。

感谢所有帮助!

【问题讨论】:

  • 看起来 webresource.axd 是在没有 SSL 的情况下直接请求的。你找到解决办法了吗?
  • @Cerveser:我没有,不——我学会了忍受它:(

标签: asp.net logging error-handling


【解决方案1】:

/WebResource.axd 通常被请求,因为页面包含指向它的链接,通常是 img src:

<img ... src="/WebResource.axd..." />

通常从 ASP.NET WebControl 生成,例如一个菜单控件。

我建议您找到包含 WebResource.axd 引用的页面,查看生成它的方式和原因,以及它为何无效。例如,您可以查看 IIS 服务器日志以查找紧接在 WebResource.axd 请求之前的页面,或者您可以将自己的日志记录添加到 Application_BeginRequest。

一旦您发现了有问题的页面,并确定了页面上的哪个控件正在生成请求,请在此处再次询问。

我过去在静态 HTML 页面中看到过这种情况,该页面包含从呈现的 ASPX 页面复制和粘贴的 HTML(例如菜单)。该请求在静态 HTML 页面中无效,修复只是删除了有问题的 img 元素。

【讨论】:

  • 感谢您的回复,乔。但是,在我的站点中,任何页面上都没有明确引用 WebResource.axd(也没有任何其他 AXD 文件);唯一存在字符串“WebResource.axd”的地方是 Global.asax 文件、web.config 文件和一些第三方 .js 文件(由 Telerik 编写)。我宁愿认为这是一个随机请求资源的机器人。实际上,如果我直接将 WebResource.axd URL 放入自己,我的代码仍然会将错误写入应用程序日志。这是我要避免的事情!
  • @EdGraham - “没有明确引用 WebResource.axd ...” - 是的,但是如果您在 .axd 请求之前找到该页面,您将能够查看它的内容在请求它的页面上。例如。该页面可能包含错误地请求它的第三方 .js 文件之一。如果在静态 .js 文件中看到对它的有效请求,我会感到惊讶,因为我看不到 .js 文件如何知道如何生成有效的查询字符串。使用 Fiddler 并可能在 .js 文件中插入警报语句,您应该能够准确确定生成违规请求的位置。
  • 再次感谢乔,但我们没有抓住重点。我并不是要消除对 WebResource.axd 的请求;我试图防止将产生的错误写入应用程序日志。我想知道我是否可以修改 Global.asax 或以某种方式更改 web.config 文件来实现这一点。
【解决方案2】:

我只有在收到来自 Bingbot 爬虫的请求时才会收到此错误。你可以看看是不是bing bothere

所以我在我的 robots.txt 文件中添加了这个。如果您不特别添加它是用户代理 Bingbot,它就不起作用

User-agent: bingbot
Disallow: /ScriptResource.axd  
Disallow: /combinescriptshandler.axd  
Disallow: /WebResource.axd 

【讨论】:

  • 很好——非常感谢。事实上,它是百度蜘蛛:不过,同样的解决方案!
  • 其实百度不服从robots.txt所以我已经在web.config文件中屏蔽了。
  • Bing bot 也不遵守 robots.txt,那么 robots.txt 有什么用呢?
【解决方案3】:

当 Bingbot 做了一些非常愚蠢的事情并将其请求的 URL 小写时,可能会导致这些错误。

我不太清楚它为什么会这样,但事件日志中列出的 URL 实际上是从受影响的页面链接的——只有一些大写字母!例如,HTML 中的实际链接:

https://example.com/WebResource.axd?d=[...]13QzJRP4goegQTwpQQcl[...]

bingbot 请求的相同链接:

https://example.com/webresource.axd?d=[...]13qzjrp4goegqtwpqqcl[...]

哦,好吧...这些显然是可以忽略或抑制的无害错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-07
    • 2023-03-27
    • 1970-01-01
    相关资源
    最近更新 更多