从通用处理程序(ashx)文件中捕获ASP.NET中的异常

我正在尝试使用我的ASP.NET网站获取不同的服务器端堆栈。 我的ashx文件似乎在抛出500内部服务器错误。 我怎么知道这个ashx文件抛出什么异常或者抛出500的原因? 当我附加到我的IIS 7 w3wp.exe进程时,它不会引发异常,但我正在阅读,可能是这种情况。

ashx文件位于我的ASP.NET站点的根目录中,并且属性将它设置为编译。

GET http://uhc-8:8883/MyApp/ExtDirectProxy.ashx 500 (Internal Server Error) index.html:27
Uncaught TypeError: Cannot read property 'isProvider' of null ext-all-debug.js:74832
allow right click initializing for http://uhc-8:8883/MyApp/index.html rightclick.js:1
allow right click processing http://uhc-8:8883/MyApp/index.html rightclick.js:25

如果你有一个名为“App_Code”的文件夹,你可以通过头痛和偏头痛。 或者简单地用“code”或“data”等随机名称替换“App_Code”,并将类放在那里以解决此问题。 在我的情况下,我的项目GUID是一个Web应用程序和C#类型。

最佳答案:

App_Code文件夹问题

注意:

我正在使用带有静态端口的IIS来运行该网站,而不是使用带动态端口的Visual Studio 2012。 我在Web服务器上有特定的服务器配置,所以我希望网站的行为与我们发布的网站的工作方式相同。 所以我就这样运行它。

回答我的问题:

发生这种情况是因为我们在bin文件夹中有重复版本的App_Data类。 * .cs的“编译”版本以及* .cs的网站版本。 当存在多个具有相同名称的类时,会发生“isProvider”错误。 当我们部署ASP.NET应用程序时,我们只部署* .cs文件的编译版本。 在开发环境中,我们将它们设置为“属性”>“构建操作”>“无”。

不确定一个简单的方法。 它可能与临时文件夹和/或obj文件夹中的东西有关,但不完全确定。 将采取一些更多的故障排除来找出原因。 与此同时,这里是解决问题的事情清单。 不确定是否有一些或所有这些都是必要的,但它现在正在工作。

要解决的步骤:

  • 将所有App_Data * .cs文件更改为“属性”>“生成操作”>“编译”
  • 修复它们抛出的异常,让构建再次运行 - 清理解决方案>构建解决方案...一个异常未被设置为属性>构建操作>无的异常捕获,所以这就是为什么这是必需的。 本质上,Visual Studio 2012不会抛出异常并说“构建成功”。
  • 然后将App_Data * .cs文件更改回“属性”>“构建操作”>“无”
  • 从 obj Debug中删除dll
  • 从 bin中删除dll
  • 删除临时的ASP.NET文件 - C:WINDOWSMicrosoft.NETFramework{.NET version}Temporary ASP.NET Files
  • 构建解决方案
  • 重新启动IIS网站
  • 现在事情很好!

    编辑:

    实际的问题是我在Visual Studio中引用了一个外部项目,但是没有dll文件,因为项目类型是控制台应用程序,而不是类库。 真正的问题在于,当你有一个对其他项目的使用语句时,Visual Studio声称它会编译好代码(在App_Code中),但即使构建成功,即使对于所有* .cs文件中的Build Action> Compile选项App_Code文件。 运行Web应用程序时,必须将其重新设置为“生成操作”>“无”才能使其运行。 但是,由于App_Code中的* .cs文件实际上并未使用新代码编译(如果这是IIS中的ASP.NET如何处理这些App_Code * .cs文件),它会引发500内部服务器错误,因为没有良好的CIL代码在运行期间。 为了解决这个问题,我只是将项目类型更改为类库,但它仍然没有错误,但现在可以将dll引用到其他项目。

    发现重复的类时,始终会发生isProvider错误。 所以我不确定为什么会出现这种情况,但是一旦您修复了上述部分,就会消失。


    您可以使用Global.asax文件中的Application_Error事件来捕获该错误。

    protected void Application_Error(Object sender, EventArgs e)
    {
        HttpContext ctx = HttpContext.Current;
        Exception exception = ctx.Server.GetLastError();
        int httpCode = ((HttpException)exception).GetHttpCode(); // check if it is 500
    }
    
    链接地址: http://www.djcxy.com/p/83437.html

    上一篇: Catch exceptions in ASP.NET resulting from Generic Handler (ashx) file

    下一篇: Monitoring when a radio button is unchecked