【问题标题】:c#/asp.net - How to catch "System.Web.HttpException: Request timed out"?c#/asp.net - 如何捕捉“System.Web.HttpException:请求超时”?
【发布时间】:2012-12-07 18:24:01
【问题描述】:

在我的 asp.net/c# 项目中,我使用 iTextsharp dll 从许多 pdf 文档中读取文本,但有时我会收到此错误

System.Web.HttpException:请求超时。

但是执行它的代码是:

    public static bool does_pdf_have_keyword(string keyword, string pdf_src) 
    {
        try
        {
            PdfReader pdfReader = new PdfReader(pdf_src);
            string currentText;
            int count = pdfReader.NumberOfPages;
            for (int page = 1; page <= count; page++)
            {
                ITextExtractionStrategy strategy = new SimpleTextExtractionStrategy();
                currentText = PdfTextExtractor.GetTextFromPage(pdfReader, page, strategy);
                if (currentText.IndexOf(keyword, StringComparison.OrdinalIgnoreCase) != -1) return true;
            }
            pdfReader.Close();
            return false;
        }
        catch
        {
            return false;
        }
    }

那么为什么页面在尝试捕获时会进入未处理的异常,而捕获应该捕获所有内容?

【问题讨论】:

  • 你是怎么运行这个的?在 Visual Studio 中?
  • 请发布堆栈跟踪
  • 不,它是一个在 sharepoint 2010 中运行的 web 部件(所以在服务器端),如果页面进入未处理的错误状态,我如何获得它的堆栈跟踪?如果我能够捕捉到错误,我可以获得堆栈跟踪。
  • 我怀疑这甚至不是引发该异常的代码部分,因为 PdfReader(string filename) 从文件而不是 url 读取。我的猜测是这个操作耗时太长,http请求超时。
  • @christian,不,它也可以从 pdf 的路径读取,因为它大部分时间都可以工作,但有时我会收到请求超时的未处理错误。

标签: c# asp.net itextsharp httprequest


【解决方案1】:

我认为您的try 没有捕获此异常的原因是您收到的异常不是从您的代码本身引发的,而是从服务器引发的。

这样想:

  • 您的代码运行良好,只是需要很长时间。
  • 服务器监控请求花费了多长时间,终止请求并引发异常。

所以你的代码实际上并没有抛出那个异常。

现在,如果您想了解或记录它,您可以在您的 Global.asax 文件中使用 Application_Error 方法(假设您可以访问它,我不确定它如何与 SharePoint 一起使用) .

例如,在我的一个 Web 项目中,我想记录所有错误,即使是未捕获的错误。所以我做的是这样的:

protected void Application_Error(object sender, EventArgs e) {
    //Log ALL uncaught exceptions
    Exception exc = Server.GetLastError();
    if (exc is HttpUnhandledException) {
        exc = Context.Error.InnerException;
    }
    //Log error here
}

我不确定除了记录它之外你还能做些什么。我不知道这发生在页面生命周期的哪个位置,所以我不确定你是否可以做一些事情,比如获取当前的 HTTP 请求对象并重定向用户。

希望这会有所帮助。

【讨论】:

  • 我可以重定向用户,但我不明白如何检测请求何时超时(在页面进入错误屏幕之前)。
  • 就像我说的,页面超时在您的代码之外。我不确定是什么代码引发了异常(即您将try 放在哪里),但这会让您记录它并弄清楚。或者在错误发生后将用户重定向到另一个页面。
【解决方案2】:

您正在捕获异常,但是,因为它是 ThreadAbortException,所以框架会自动重新抛出它。请参阅here 了解更多信息。

问题在于您的 PDF 关键字搜索代码(有时)花费的时间超过了指定的 HTTP 执行超时时间。我不知道 Sharepoint 的默认超时时间是多少,但您应该可以增加它。

【讨论】:

    猜你喜欢
    • 2011-11-06
    • 1970-01-01
    • 1970-01-01
    • 2015-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多