c#/ asp.net – 如何捕获“System.Web.HttpException:Request timed out”?

在我的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; } } 

那么为什么页面在try catch中遇到未处理的exception并且catch应该捕获所有内容?

我认为您的try没有捕获此exception的原因是您获得的exception不会从您的代码本身抛出,而是从服务器抛出。

这样考虑一下:

  • 你的代码运行正常,只需要很长时间。
  • 服务器监视请求的持续时间,终止请求并抛出exception。

所以你的代码实际上并没有抛出exception。

现在,如果您想了解它或记录它,您可以在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请求对象并重定向用户。

希望这可以帮助。

您正在捕获exception,但是,因为它是一个ThreadAbortException,所以框架会自动重新抛出它。 有关更多信息,请参见此处

问题是您的PDF关键字搜索代码(有时)花费的时间超过指定的HTTP执行超时。 我不知道Sharepoint的默认超时是什么,但你应该能够增加它。